Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中解析值_Javascript_Asynchronous_Callback_Promise - Fatal编程技术网

在javascript中解析值

在javascript中解析值,javascript,asynchronous,callback,promise,Javascript,Asynchronous,Callback,Promise,我有以下代码: function doSomething() { //xhr here setTimeout(function() { var value = 42; }, 10); return { then: function(callback) { callback(value); } }; } doSomething().then(function(result) { log("got a result", resul

我有以下代码:

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);
});
并且不知道如何访问该值。 我需要这是基于承诺的解决方案,以便在多个地方使用

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

存在以下几个问题:

  • value
    是传递到
    setTimeout
    中的函数的本地值,因为您在这里声明了它。您可以通过在
    doSomething
    中声明来解决此问题

  • 更大的问题是,你所拥有的并不是承诺,它只是一个函数,当你调用它时,它返回一个对象,这个对象有一个
    then
    方法。事情发生的顺序如下:

  • 您可以调用
    doSomething

  • 它设置一个定时器来设置一个值

  • 它使用
    然后
    函数创建一个对象

  • 它返回对象

  • 您可以立即调用
    然后
    函数

  • 然后
    尝试访问
    (由于声明问题,无法访问该值,但无论如何都会有问题)

  • 一段时间后
    由计时器启动时的回调设置

  • 作为一个承诺,您返回的对象上的
    then
    函数必须存储对传递给它的回调的引用,并在设置
    value
    后调用回调(例如,承诺已实现)


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

    这里有几个问题:

  • value
    是传递到
    setTimeout
    中的函数的本地值,因为您在这里声明了它。您可以通过在
    doSomething
    中声明来解决此问题

  • 更大的问题是,你所拥有的并不是承诺,它只是一个函数,当你调用它时,它返回一个对象,这个对象有一个
    then
    方法。事情发生的顺序如下:

  • 您可以调用
    doSomething

  • 它设置一个定时器来设置一个值

  • 它使用
    然后
    函数创建一个对象

  • 它返回对象

  • 您可以立即调用
    然后
    函数

  • 然后
    尝试访问
    (由于声明问题,无法访问该值,但无论如何都会有问题)

  • 一段时间后
    由计时器启动时的回调设置

  • 作为一个承诺,您返回的对象上的
    then
    函数必须存储对传递给它的回调的引用,并在设置
    value
    后调用回调(例如,承诺已实现)


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

    我只是指出,为了“修复”您的问题,您需要通过以下方式返回
    ,然后

    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的答案并考虑使用允诺库,也可以考虑阅读来解释承诺解决方案的样子。
    也就是说:调用链接时,您的
    then
    需要依次返回一个承诺(而不仅仅是设置一个超时),在等待它之前,回调应该被同化。

    我只是指出,为了“修复”您的问题,您需要通过以下方式返回
    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的答案并考虑使用允诺库,也可以考虑阅读来解释承诺解决方案的样子。
    也就是说:
    然后
    在调用链接时需要返回一个承诺(而不仅仅是设置一个超时),在等待回调之前,回调应该被同化。

    每次定义一个新函数时,您都会创建一个新的作用域,并且在该作用域内定义的变量在其外部不可用。变量在超时范围内,仅返回
    then
    函数并不能保证。警告-返回不符合规范的
    then
    函数是有风险的,可能会导致意外结果。它可能工作,但它不是那么简单——考虑使用一个承诺库并读取每次定义一个新函数时,创建一个新的作用域,并且在该范围内定义的变量在它之外是不可用的。变量在超时范围内,仅返回
    then
    函数并不能保证。警告-返回不符合规范的
    then
    函数是有风险的,可能会导致意外结果。它可能工作,但它不是那么简单-考虑使用承诺库和阅读