【问题标题】:Execute statements only after the Jquery promise is complete?仅在 Jquery 承诺完成后执行语句?
【发布时间】:2017-05-26 05:32:13
【问题描述】:

我试图执行一个需要顺序执行语句的函数。 我将 Jquery deferred 用于承诺,但承诺之后的语句最初执行。如何按顺序执行所有语句? http://jsfiddle.net/e4wptvjv/

var test = 0;
function a(){
  var deferred = $.Deferred();
  setTimeout(function(){    
    console.log("a completed");
    test++;
    deferred.resolve("from a");
  },500);
  return deferred.promise();
};
function b(){
  var deferred = $.Deferred();
  setTimeout(function(){
    console.log("b completed");
    test++;
    deferred.resolve("from b");
  },200);
  return deferred.promise();
}

function testFn(){
  var d = jQuery.Deferred(), 
  p=d.promise();
  p.then(a).then(b);
  d.resolve();
  console.log("this statement will execute after a & b completed");
  return test;
}

var result = testFn();
console.log(result);

【问题讨论】:

  • 代码有一个常见的误解,即异步代码可以使用 Promise 同步。没有办法让异步代码同步,如果停下来想一想,就很明显了
  • Rebornx,你已经了解p.then(a).then(b),所以了解p.then(a).then(b).then(doSomethingElse)并不是一个巨大的步骤。
  • @JaromandaX 现在我明白了。

标签: javascript jquery promise jquery-deferred


【解决方案1】:

我更新你的代码

http://jsfiddle.net/e4wptvjv/3/

这是testFn函数的代码

return a().then(b).then(function(){console.log("this statement will execute after a & b completed");return "last"});;

我先调用一个函数,最后调用b函数,然后将消息放入控制台并返回一个字符串。

【讨论】:

  • 但是我不能按照你的建议调用初始函数。 testFn().then(function(lastResult){ console.log(lastResult); });它必须被称为 result = testFn();
  • 你不能直接得到来自 testFn 的结果。在每种情况下,它都是一个承诺,因为承诺是异步的
  • 那么你的意思是没有办法实现同步执行行为?还是强制承诺完成以执行下一条语句?
  • 不,你不能。但是我问你一个问题:如果你想要同步执行,为什么要使用 Promise?
  • Bcz 两个函数中很少有 ajax 请求。
【解决方案2】:

更新小提琴:http://jsfiddle.net/dyh1jgLj/3/

与 Marco Morelli Moretti 的回答不同,这个答案将“a”和“b”并行,但同时等待它们。

function testFn(){
  $.when(a(), b()).then(function(){
    console.log("this statement will execute after a & b completed");
  });
}

【讨论】:

  • 最终结果仍然未定义 :( Bcz 该语句在这些承诺完成之前执行
  • @Rebornx 你要求的是不可能的。 JavaScript 是同步的,如果你查看你的代码,你分配result 的部分没有处理testFn() 的异步行为。如果您的所有代码都包装在一个函数中,只需使用两个答案都暗示的承诺,然后让包装函数返回承诺。
猜你喜欢
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-26
  • 1970-01-01
相关资源
最近更新 更多