我有一个函数,当进程成功时返回成功回调,当进程失败时返回失败回调。
问题是如何等待函数直到它完成并获得返回值,然后继续执行其他代码。
我试图使用提供jquery的$ .deffered,promise函数,但它似乎不适用于非ajax函数。
这就是我的功能
function process(){
var picture = foo(parameters,callbackOnSuccess,callbackOnFail);
var picture1 = bar(parameters,callbackOnSuccess,callbackOnFail);
// wait untill the values are returned and do some code with picture and picture1 vars ...
}
function callbackOnSuccess(res){
return res.pictureID;
}
function callbackOnFail(error){
return error.message;
}
PS:我不能将我的整个代码放在CallbackOnSuccess上,因为它不是解决方案,特别是当我有很多我需要等待的功能时。
答案 0 :(得分:1)
延迟jQuery是实现这一目标的方法。您需要使用$ .Deferred创建promise对象,并根据您的要求解决/拒绝它们。 我为此创造了一个小提琴。希望它能帮助你:))
https://jsfiddle.net/gnekLssh/1/
如果您在小提琴中看到所有值都先打印,一旦打印出值,该方法将转到成功回调。 请不要去回调地狱的道路。我们都可以做得更好。
$(document).ready(function() {
function success(data){
alert('I am inside success');
alert(data);
}
function failure(data){
alert('I am inside failure');
alert(data);
}
function always(){
alert('I will always be called')
}
function demoPromise(){
$.when(showPromiseSuccessMagic(true)).then(success,failure).always(always);
$.when(showPromiseSuccessMagic(false)).then(success, failure).always(always);
}
function showPromiseSuccessMagic(isSuccess){
alert('Inside showPromise');
var deferred = $.Deferred();
if(isSuccess){
setTimeout(function(){
alert('Starting countdown now');
for(var counter =0; counter <10; counter ++){
$("#counter").append(counter);
alert(counter);
if(counter == 9){
alert('Now counter will stop and promise will resolve');
deferred.resolve('Resolved value goes here');
}
}
}
, 2000);
}else{
deferred.reject('Rejected Value goes here');
}
return deferred.promise();
}
function showPromiseFailureMagic(){
var deferred = $.Deferred();
deferred.reject('Rejected promise');
return deferred.promise();
}
demoPromise();
});
<div id ="counter"></div>
希望这会有所帮助。
快乐学习
Vatsal
答案 1 :(得分:-2)
您希望同步处理,而不是异步处理。尝试在jQuery ajax函数中使用async:false。
答案 2 :(得分:-2)
使呼叫同步。代码将等待响应
var request = new XMLHttpRequest();
request.open('GET', '/bar/foo.txt', false); // `false` makes the request synchronous
request.send(null);
if (request.status === 200) {
console.log(request.responseText);
}