jQuery依赖AJAX调用promise

时间:2018-02-20 11:40:42

标签: javascript jquery promise

我有2个异步调用

function async1() {
  return $j.post('/call1', JSON.stringify({
    id: my_id
  }), function(response) {
    if (response.success) {
      // resolve
    } else {
      // reject
    }
  });
}

function async2() {
  return $j.post('/call2', JSON.stringify({
    id: my_id
  }), function(response) {
    if (response.success) {
      // resolve
    } else {
      // reject
    }
  });
}

main()函数开始,我需要先调用async1(),如果成功,将调用async2()

我打算从main()返回一个承诺。我主要担心的是我需要根据回复明确解决或拒绝。任何人都可以告诉我如何使用promises / deferred进行它吗?

3 个答案:

答案 0 :(得分:0)

可以这样:

int[]

答案 1 :(得分:0)

首先调用async1(),并在async1()成功响应时执行async2()函数。像这样:

function async1() {

  return $j.post(
        '/call1',
        JSON.stringify({id: my_id}),
        async2(response)    // <-- Replace function(response){} to this.
  });

}

然后在async2函数上:

function async2(dataAsync1) {
  var data = dataAsync1;  //Response from previews Ajax call...
                          //TODO: Handle this
  return $j.post(
    '/call2',
    JSON.stringify({id: my_id}),
    function(response) {
        if (response.success) {
            // resolve
        }
        else {
            // reject
        }
   });
}

答案 2 :(得分:0)

  

我主要担心的是,我需要根据回复明确解决或拒绝。

好担心:不,你不是。只需使用jQuery&#39; post的承诺给出的结果。

由于您使用的是jQuery v1.x,我只是注意到它的Deferred对象 Promises / A +兼容。你可能会或可能不会关心这一点。不过,我假设您正在使用v1.8或更高版本。

因此,如果您使用jQuery的非Promise / A +兼容Deferred和promise,那么只需返回post的结果。

我会坚持使用ES5语法,因为您正在使用jQuery v1.x而且我猜测您没有进行转换等等。

function async1(my_id/* I assume it's a parameter?*/) {
    return $j.post(
        '/call1',
        JSON.stringify({id: my_id})
    );
}

function async2(my_id/* I assume it's a parameter?*/) {
    return $j.post(
        '/call2',
        JSON.stringify({id: my_id})
    );
}

...在main中,使用&#34; promises&#34;:

function main(some_id) {
    return async1(some_id).then(function(result1) {
        return async2(some_id).then(function(result2) {
            return [result1, result2];
        });
    });
}

该示例有main返回数组的承诺,其中数组中的第一个条目是async1的结果,第二个条目是async2的结果(或者它拒绝,因为其中一个失败了)。不过,您可以通过更改第二个then处理程序中的返回值来调整它。

如果,您希望main返回原生承诺(必要时使用polyfill),我可能会通过为自己提供一个包装来提前转换为本机承诺{1}}提供本机承诺:

post

然后

function postPromise() {
    var args = Array.prototype.slice.call(arguments);
    return new Promise(function(resolve, reject) {
        $j.post.apply($j, args)
            .done(resolve)
            .fail(function(jqXHR, textStatus, errorThrown) {
                if (errorThrown) {
                    reject(errorThrown);
                } else {
                    reject(new Error(textStatus)); // or whatever
                }
            });
    });
}

...在function async1(my_id/* I assume it's a parameter?*/) { return postPromise( '/call1', JSON.stringify({id: my_id}) ); } function async2(my_id/* I assume it's a parameter?*/) { return postPromise( '/call2', JSON.stringify({id: my_id}) ); } 中,使用&#34; promises&#34;:

main

具有使用jQuery&lt;的优点(?) V1.8。