所有的承诺取决于另一个承诺的结果
$q.all promise depends on result of another promise
我目前有三个嵌套的promise,我想把它们变成$q.all调用。
它看起来像这样。
ds.saveData(data).then(function (result1){
someOtherVar = result1.Id;
ds.saveSomethingDependant(someOtherData).then(function (result2){
ds.saveAThirdThing(someOtherVar).then(function (result3){
ns.notify();
}, function (error){
ns.error(error);
});
}, function (error){
ns.error(error);
});
}, function (error) {
ns.error(error);
});
哇,真是一团糟。我关心的是在哪里编辑OtherVar。有没有其他方法可以做到这一点,这样我就没有嵌套的promise,但在一个promise之后仍然编辑数据?嵌套的承诺对来说是一场噩梦
谢谢!
由于result2
依赖于result1
,因此必须等到后者准备好后才能执行前者。但是,如果第一个和第三个操作不相互依赖,您仍然可以使用$q.all
:
$q.all({
saveData: ds.saveData,
saveAThirdThing: ds.saveAThirdThing
}).then(function(results) {
/* expect(results).toEqual({
* saveData: result1,
* saveAThirdThing: result3
* });
*/
return saveSomethingDependent(results.saveData.Id);
}).then(function(result2) {
// all done
ns.notify();
}, function(error) {
// something in the chain above failed
ns.error(error);
});
我们利用了这样一个事实,即您可以从解析处理程序返回promise,然后解析处理程序将在将该promise发送到链中的下一个promise之前解析该promise(从而避免嵌套)。
您还可以通过将拒绝处理程序放在链的末尾来进行一些简化,因为您在示例中以相同的方式处理所有错误。
让我们说一下简单可读的方法链
var saveDate = function(data) {
return ds.saveDate(data);
}
var saveOtherthings = function(result) {
return $q.all([ds.saveSomethingDependant(result.id), ds.saveAThirdThing(result.id)])
}
saveDate(data)
.then(saveOtherthings)
.then(function(result) {
ns.notify();
}, function(error) {
ns.error(error);
});
相关文章:
- 一个承诺换多个承诺-并发问题
- 如何只输出一个SQL结果
- 承诺,如果第一个失败,则返回第二个承诺结果
- 不要在顺序链式承诺中包含 q 承诺结果
- WinJS,从可能是异步的函数返回一个承诺,也可能不是异步的
- 读取一个本地文件,编码为base64,我想给用户一个将结果保存到文件的选项
- 在jQuery中,.state()如何确定一个承诺是挂起的、已解决的还是被拒绝的
- 转换嵌套'对于'循环成一个承诺,为了一个承诺?嵌套承诺
- 如何通过Bluebird承诺您自己的javascript api,该api使用另一个承诺的api
- jasmine 2.0测试angularjs的工厂方法,这是一个承诺
- 做一些 ajax 并使用 getJSON 返回一个承诺
- 在 AngularJS 中声明一个承诺,并带有命名的成功/错误回调
- 链承诺.all 与从上一个承诺返回的数组.all.
- 如何更好地停止一个承诺链并开始另一个承诺链
- 同时循环承诺,直到另一个承诺结束
- 如何使用 Parse.promise javascript 定义一个承诺数组并获取结果数组 [parse.com]
- 承诺链接:在next-then回调中使用上一个承诺的结果
- 所有的承诺取决于另一个承诺的结果
- 一个承诺的意外结果
- 中继Q承诺结果到另一个承诺