2017-01-22 10 views
2

ES6プロミスを使用すると、次のような状況でどのように壊れますか?NodeJSプロミスを破る

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); 
    }); 
} 

これをどのように破るべきかを明確にしたドキュメントはありませんでした。 チェーンの代わりにthen私はそれを最初のthenの中に持つことができましたが、より複雑な要求では、それらを連鎖させることができればうれしいでしょう。

+0

これはきれいで標準的な方法では可能ではありません。同様のことについては、[この回答](https://stackoverflow.com/questions/29478751/how-to-cancel-an-emcascript6-vanilla-javascript-promise-chain)を参照してください。私は過去に、それぞれの 'それから'ヌルを返すことでこれをしました。それは恐ろしいほど面倒です。私が「catch」ステートメントでそれを壊してテストしたいときに投げたりします。これはやはりハッキリと感じます。 –

答えて

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(); 

このようなもののデフォルトの戻り値がundefinedであるため、何も返さない場合でも実行されます。この値は未定義含め約束ではない場合、それはあなたがすることができthis

上のMozillaのドキュメントに関連する約束

の履行値となるコードがundefined

で解決仮定され早めに拒否してPromiseチェーンを破ってください。

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

あなたは別名あなたが解決することはありません約束を返すことによって鎖への未解決の約束を注入することができ、次のチェーン約束リンクを実行しない約束チェーンを壊したい場合。

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 
関連する問題