2017-01-22 5 views
2

Mit ES6 Promises, wie kann ich es in dem folgenden Szenario brechen?NodeJS brechen ein Versprechen

addClient: function(request, response, next) { 
    var id = mongo.validateString(request.body.id); 

    mongo.Test.findOne({ 
     id: id 
    }) 
    .then(client => { 
     if (client) { 
      // want to break here 
      response.status(400).send({ 
       error: 'client already exists' 
      }); 
     } else { 
      return auth.hashPassword(mongo.validateString(request.body.secret)); 
     } 
    }) 
    .then(hashedSecret => { 
     // gets executed even if I don't return anything 
     return new mongo.Test({ 
      name: mongo.validateString(request.body.name), 
      id: id, 
      secret: hashedSecret 
     }).save(); 
    }) 
    .then(doc => { 
     return response.status(201).send({ 
      client: { 
       id: doc._id 
      } 
     }); 
    }) 
    .catch(err => { 
     return next(err); 
    }); 
} 

Ich habe keine klare Dokumentation gefunden, die angibt, wie man das bricht. Anstatt angekettet then s konnte ich es innerhalb der ersten then haben, aber bei komplexeren Anfragen wäre es schön, in der Lage zu sein, sie angekettet zu haben.

+0

Ich bin nicht sicher, ob dies in einer sauberen, kanonischen Art möglich ist. Siehe [diese Antwort] (https://stackoverflow.com/questions/29478751/how-to-cancel-an-emcascript6-vanilla-javascript-promise-chain) für etwas Ähnliches. Ich habe das in der Vergangenheit getan, indem ich entweder 'null' durch jedes 'then' zurückgeschickt habe, was erschreckend unordentlich ist; oder werfen, wenn ich in der 'catch'-Anweisung, die sich wiederum hacky fühlt, brechen und testen will. –

Antwort

0
// gets executed even if I don't return anything 
return new mongo.Test({ 
     name: mongo.validateString(request.body.name), 
     id: id, 
     secret: hashedSecret 
    }).save(); 

Dies selbst dann ausgeführt wird, wenn Sie der Standardrückgabewert dieser Sache nichts zurück, weil undefined ist. Es wird, dass Code mit undefined

aufgelöst angenommen Wenn dieser Wert nicht ein Versprechen ist, auch nicht definiert, wird es die Erfüllung Wert des zugehörigen Versprechen

Mozilla docs auf this

Sie können Brechen Sie eine Promise Kette, indem Sie es früh ablehnen.

addClient: function (request, response, next) { 
    var id = mongo.validateString(request.body.id); 
    mongo.Test.findOne({ 
    id: id 
    }).then(client => { 
    if (client) { 
     // reject with a type 
     return Promise.reject({ 
     type: 'CLIENT_EXISTS' 
     }); 
    } 
    return auth.hashPassword(mongo.validateString(request.body.secret)); 
    }).then(hashedSecret => { 
    // gets executed even if I don't return anything 
    return new mongo.Test({ 
     name: mongo.validateString(request.body.name), 
     id: id, 
     secret: hashedSecret 
    }).save(); 
    }).then(doc => { 
    return response.status(201).send({ 
     client: { 
     id: doc._id 
     } 
    }); 
    }).catch((err) => { 
    // check type 
    if (err.type === 'CLIENT_EXISTS') { 
     return response.status(400).send({ 
     error: 'client already exists' 
     }); 
    } 
    return next(err); 
    }); 
} 
0

Wenn Sie ein Versprechen Kette brechen aka nicht die folgenden gekettet Versprechen Links führen Sie eine ungelöste Versprechen in die Kette injizieren kann durch ein Versprechen der Rückkehr, die nie lösen wird.

new Promise((resolve, reject) => { 
    console.log('first chain link executed') 
    resolve('daniel'); 
}).then(name => { 
    console.log('second chain link executed') 
    if (name === 'daniel') { 
     return new Promise(() => { 
      console.log('unresolved promise executed') 
     }); 
    } 
}).then(() => console.log('last chain link executed')) 




// VM492:2 first chain link executed 
// VM492:5 second chain link executed 
// VM492:8 unresolved promise executed 
Verwandte Themen