我有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进行它吗?
答案 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。