如何等待直到非ajax函数完成并返回值

时间:2016-02-09 04:12:33

标签: javascript jquery

我有一个函数,当进程成功时返回成功回调,当进程失败时返回失败回调。

问题是如何等待函数直到它完成并获得返回值,然后继续执行其他代码。

我试图使用提供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上,因为它不是解决方案,特别是当我有很多我需要等待的功能时。

3 个答案:

答案 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);
}

来源:https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Synchronous_and_Asynchronous_Requests