我面临一个麻烦的问题,因为它不会每次都发生:
我用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参数(或者只是将其作为唯一参数直接传递给callPromiseWS2callPromiseWS3),则可以简化此过程并消除需要上面的两个return语句和很多代码:

myfunc = function() {
    return callPromiseWS1()
    .then(callPromiseWS2)
    .then(callPromiseWS3);
};


请记住,任何使用promise的函数都应返回promise,或在最后调用.done()

出于个人喜好,我认为对返回promise的函数使用命名方案是一个好主意,这样您就可以知道它们返回需要处理的promise。

关于javascript - 将网络服务调用与promise链接起来并不总是可行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23267326/

10-09 20:35