我面临一个麻烦的问题,因为它不会每次都发生:
我用angularJS(托管在Django / Tastypie中)调用webservices,并带有保证,以便仅在成功执行WS1后才调用WS2(Web Service#2),等等。
代码如下:
myfunc = function() {
callPromiseWS1()
.then(function(data){
callPromiseWS2()
})
.then(function(data){
callPromiseWS3()
})
};
WS2是一个POST请求,用于在数据库中写入内容。
WS3是一个POST请求,它使用WS2创建的内容。
有时(并非总是如此),WS3会失败,因为应该已经由WS2创建的对象不存在。
当然,如果我稍后尝试手动执行WS3请求,它将起作用。
我感觉WS2和WS3是并行执行的,这不是我期望的。
任何想法?谢谢。
最佳答案
您缺少3个return语句,但是您遇到的行为尤其是由于其中之一:
myfunc = function() {
return callPromiseWS1()
.then(function(data){
return callPromiseWS2(); // this one
})
.then(function(data){
return callPromiseWS3();
})
};
如果您不返回
callPromiseWS2
返回的承诺,则then()
不会知道它正在处理一个承诺,并且只要then
中的同步代码完成,就移至下一个callPromiseWS2
。请注意,如果您实际上并没有在每个步骤中使用
data
参数(或者只是将其作为唯一参数直接传递给callPromiseWS2
和callPromiseWS3
),则可以简化此过程并消除需要上面的两个return语句和很多代码:myfunc = function() {
return callPromiseWS1()
.then(callPromiseWS2)
.then(callPromiseWS3);
};
请记住,任何使用promise的函数都应返回promise,或在最后调用
.done()
。出于个人喜好,我认为对返回promise的函数使用命名方案是一个好主意,这样您就可以知道它们返回需要处理的promise。
关于javascript - 将网络服务调用与promise链接起来并不总是可行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23267326/