【问题标题】:Understanding promises in javascript using when library使用when库理解javascript中的promise
【发布时间】:2014-01-16 20:32:03
【问题描述】:

我一直在尝试围绕异步编程和 Promise 的使用。为了帮助理解它们,我编写了一些简单的嵌套代码,但遇到了障碍。

这是代码:http://pastebin.com/hBtk9vER 确保在库时安装(npm install)

var when = require('when');

function promise() {
  console.log("Promise");
    promiseRead().then(function(string) {
    console.log("Inner promise");
    console.log(string);
    });
}

function promiseRead() {
  console.log("PromiseRead");
  return baz().then(function() {
    console.log("Inner Read");
    var deferred = when.defer();
    setTimeout(function() {
      deferred.resolve("Hello World");
    }, 5000);
  });
}

function baz() {
  console.log("BAZ");
  return when(true); 
}

promise();

我的问题是 console.log(string) 是未定义的,当我期望它在 promiseRead() 解决后是 "Hello World" 时。有趣的是,当我删除超时时,它按预期工作。谁能帮忙解释一下,为什么promise 函数在promiseRead() 超时之前执行它的代码。

非常感谢

【问题讨论】:

  • 我没有时间给出完整的答案,但是在您的Inner Read 中您不会返回任何东西(没有承诺),所以您在这个地方的var deferred = when.defer(); 是没用的。
  • 补充一点,我知道你正在试验,但如果你不以结构化的方式使用它们,承诺并没有多大帮助。承诺点(IMO)是线性组织异步代码。您可以通过添加拒绝和传递延迟来使这更加复杂,但我希望您现在能明白为什么保持基于 Promise 的代码干净很重要。

标签: javascript node.js when-js


【解决方案1】:

看起来你需要在 promiseRead() 中返回你的延迟对象

【讨论】:

  • 太棒了,谢谢。我的印象是deferred.resolve() 会返回一个延迟对象,但显然没有考虑语言的异步特性。所以在我的例子中,promiseRead 在延迟解决之前返回 null 并且它上面的函数在堆栈上,无法知道一个承诺必须等待?
【解决方案2】:

一些更新

var when = require('when');

function promise() {
  console.log("Promise");
    promiseRead().then(function(string) {
    console.log("Inner promise");
    console.log(string);
    });
}

function promiseRead() {
  console.log("PromiseRead");
  return baz().then(function() {
    console.log("Inner Read");
    var deferred = when.defer();
    setTimeout(function() {
      deferred.resolve("Hello World");
    }, 5000);
    return deferred.promise;
  });
}

function baz() {
  console.log("BAZ");
  return when(true); 
}

promise();

【讨论】:

  • 这是对您问题的回答吗?里面还有问题吗?如果它是您问题的答案,请花时间解释您是如何解决它的。
  • 谢谢你。这有助于我理解问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
相关资源
最近更新 更多