解析 javascript 中的值

Resolve value in javascript

我有以下代码:

function doSomething() {
  //xhr here 
  setTimeout(function() {
     var value = 42;
  }, 10);
  return {
    then: function(callback) {
      callback(value);
    }
  };
}

doSomething().then(function(result) {
    log("got a result", result);
});

并且不知道如何访问该值。 我需要这是基于承诺的解决方案,以便在多个地方使用 JSFidle link

更新: 我们没有在该项目中使用任何库

那里有几个问题:

  1. value 是您传递给 setTimeout 的函数的局部变量,因为这是您声明它的地方。您可以通过在 doSomething 中声明来解决此问题。

  2. 更大的问题是你所拥有的不是承诺,它只是一个函数,当你调用它时 return 是一个具有 then 的对象方法。这是事情发生的顺序:

    1. 你打电话给doSomething

    2. 它设置一个定时器来设置一个值。

    3. 它创建了一个带有then函数的对象。

    4. 它return是对象。

    5. 你立即调用then函数。

    6. then 尝试访问 value (由于声明问题,它不能访问,但无论如何都会有问题)。

    7. 稍后value 由计时器触发时的回调设置。

    要成为一个承诺,对象 return 上的 then 函数必须存储对传递给它的回调的引用,并在 稍后,当value已经设置(例如,承诺已经实现)。

与其实现自己的 promises 库,我建议使用已经编写和调试过的几个之一。

我只是指出,为了 "fix" 您的问题,您需要 return then 这样:

function doSomething() {
  //xhr here 
  return {
    then: function(callback) {
       setTimeout(function() {
          callback(42); // callback from within the async action
       }, 10);
    }
  };
}

doSomething().then(function(result) {
    log("got a result", result);
});

请阅读 TJ 的回答并考虑使用 promise 库 - 还可以考虑阅读 this post,它解释了 promise 解析的样子。

即:您的 then 需要依次 return 调用时的承诺(而不是仅仅设置超时)以进行链接,并且回调应该在等待它之前被同化。