Nodejs 承诺在使用 q 库时不起作用
Nodejs promise not working when using q library
我正在尝试自学 promises。这是我写的代码-
var Q = require('q');
var promise = Q.fcall(function() {
// I expect this time out to delay returning the response 7.
setTimeout( console.log('hi'), 1000 );
return 7;
});
promise.then(function(contents) {
console.log(contents);
});
// Added this timeout so that the javascript execution context(node ex.js) remains alive before the code in the then block is resolved.
setTimeout( function(){console.log('bye');}, 1000 );
现在这不是打印内容。我刚明白
C:\node\Ex_Files_UaR_Node\first>节点example3.js
你好
再见
我期待得到 -
你好
7
再见
如果有任何非常明显的遗漏,请告诉我。
编辑:
P.S 下面的代码解析了 promise -
var Q = require('q');
var promise = Q.fcall(function() {
setTimeout( function(){console.log('hi');}, 1000 );
return 7;
});
promise.then(function(contents) {
console.log(contents);
});
setTimeout( function(){console.log('bye');}, 1000 );
然而,在 Q.fcall 中添加 setTimeOut 的基本思想是延迟承诺的执行。知道怎么做吗?
好了
let p = new Promise((resolve, reject) => {
setTimeout(() => resolve(4), 2000);
});
p.then((res) => {
console.log(res);
});
ES6 Promise 更简单。 p 仅在 2 秒后解析。到那时,它没有解决,也没有被拒绝。所以然后只在2秒后执行
您的第一个日志语句有问题。
我已经修改了您的代码以使其正常工作。
var Q=require('q');
var promise = Q.fcall(function() {
setTimeout( function(){console.log('hi')}, 1000 );
return 7;
})
promise.then(function(contents) {
console.log(contents);
});
setTimeout(function(){console.log('bye');}, 1000 );
但此代码将按顺序打印 7 、bye 和 hi,因为以下操作是同步发生的:
- Promise 通过调用函数
fcall()
注册。
- promise 变量使用
then()
方法注册一个处理程序。
- 您的超时功能,旨在记录 'bye',已注册。
现在以下事情按以下顺序异步发生:
- 您注册的承诺回调,您正在注册超时
打印 'hi' 并返回值 7 的函数,称为回调
来自
fcall()
.
- 现在 setTimeout 注册了旨在记录 'hi' 和
returns 值 7。
- Promise 以值 7 得到解析,并将该值记录到控制台。
- 'bye' 的超时已过期并将其记录到控制台。
- 'hi' 的超时已过期并将其记录到控制台。
希望它能使流程清晰。
我无法重现输出中没有得到 7 的问题(即使你的代码有几个逻辑错误),因为这个片段(没有任何更正)确实 生产它:
// This is browser version, so `require` is replaced by `script src` tag.
//var Q = require('q');
var promise = Q.fcall(function() {
// I expect this time out to delay returning the response 7.
setTimeout( console.log('hi'), 1000 );
return 7;
});
promise.then(function(contents) {
console.log(contents);
});
// Added this timeout so that the javascript execution context(node ex.js) remains alive before the code in the then block is resolved.
setTimeout( function(){console.log('bye');}, 1000 );
<script src="https://cdnjs.cloudflare.com/ajax/libs/q.js/1.5.0/q.js"></script>
但是有几个问题:
- 第一个
setTimeout
的第一个参数不是函数:您传递给它 console.log('hi')
而不是 function(){console.log('hi');}
。
return 7
会立即执行。如果您想延迟初始承诺的结算,那么 Q.fcall
不是您需要的方法:您需要 Q.Promise
。
以下是您的预期行为的编码方式:
var promise = Q.Promise(function (resolve, reject) {
setTimeout( function () {
console.log('hi');
resolve(7);
}, 1000 );
});
promise.then(function(contents) {
console.log(contents);
});
setTimeout( function(){console.log('bye');}, 1000 );
<script src="https://cdnjs.cloudflare.com/ajax/libs/q.js/1.5.0/q.js"></script>
请注意,Node 有一个原生的 Promise 库,您可以使用它来执行相同的操作。实在没必要加Q,直接把Q.Promise(...)
换成new Promise(...)
:
var promise = new Promise(function (resolve, reject) {
setTimeout( function () {
console.log('hi');
resolve(7);
}, 1000 );
});
promise.then(function(contents) {
console.log(contents);
});
setTimeout( function(){console.log('bye');}, 1000 );
请注意,“7”的输出顺序略有不同。这是因为 Promises 的本机实现使用微任务来安排 then
回调的执行,而 Q
使用主队列上的事件来安排该执行,该事件稍后发生。许多人会考虑原生行为 "more correct".
我正在尝试自学 promises。这是我写的代码-
var Q = require('q');
var promise = Q.fcall(function() {
// I expect this time out to delay returning the response 7.
setTimeout( console.log('hi'), 1000 );
return 7;
});
promise.then(function(contents) {
console.log(contents);
});
// Added this timeout so that the javascript execution context(node ex.js) remains alive before the code in the then block is resolved.
setTimeout( function(){console.log('bye');}, 1000 );
现在这不是打印内容。我刚明白 C:\node\Ex_Files_UaR_Node\first>节点example3.js 你好 再见
我期待得到 - 你好 7 再见
如果有任何非常明显的遗漏,请告诉我。
编辑:
P.S 下面的代码解析了 promise -
var Q = require('q');
var promise = Q.fcall(function() {
setTimeout( function(){console.log('hi');}, 1000 );
return 7;
});
promise.then(function(contents) {
console.log(contents);
});
setTimeout( function(){console.log('bye');}, 1000 );
然而,在 Q.fcall 中添加 setTimeOut 的基本思想是延迟承诺的执行。知道怎么做吗?
好了
let p = new Promise((resolve, reject) => {
setTimeout(() => resolve(4), 2000);
});
p.then((res) => {
console.log(res);
});
ES6 Promise 更简单。 p 仅在 2 秒后解析。到那时,它没有解决,也没有被拒绝。所以然后只在2秒后执行
您的第一个日志语句有问题。
我已经修改了您的代码以使其正常工作。
var Q=require('q');
var promise = Q.fcall(function() {
setTimeout( function(){console.log('hi')}, 1000 );
return 7;
})
promise.then(function(contents) {
console.log(contents);
});
setTimeout(function(){console.log('bye');}, 1000 );
但此代码将按顺序打印 7 、bye 和 hi,因为以下操作是同步发生的:
- Promise 通过调用函数
fcall()
注册。 - promise 变量使用
then()
方法注册一个处理程序。 - 您的超时功能,旨在记录 'bye',已注册。
现在以下事情按以下顺序异步发生:
- 您注册的承诺回调,您正在注册超时
打印 'hi' 并返回值 7 的函数,称为回调
来自
fcall()
. - 现在 setTimeout 注册了旨在记录 'hi' 和 returns 值 7。
- Promise 以值 7 得到解析,并将该值记录到控制台。
- 'bye' 的超时已过期并将其记录到控制台。
- 'hi' 的超时已过期并将其记录到控制台。
希望它能使流程清晰。
我无法重现输出中没有得到 7 的问题(即使你的代码有几个逻辑错误),因为这个片段(没有任何更正)确实 生产它:
// This is browser version, so `require` is replaced by `script src` tag.
//var Q = require('q');
var promise = Q.fcall(function() {
// I expect this time out to delay returning the response 7.
setTimeout( console.log('hi'), 1000 );
return 7;
});
promise.then(function(contents) {
console.log(contents);
});
// Added this timeout so that the javascript execution context(node ex.js) remains alive before the code in the then block is resolved.
setTimeout( function(){console.log('bye');}, 1000 );
<script src="https://cdnjs.cloudflare.com/ajax/libs/q.js/1.5.0/q.js"></script>
但是有几个问题:
- 第一个
setTimeout
的第一个参数不是函数:您传递给它console.log('hi')
而不是function(){console.log('hi');}
。 return 7
会立即执行。如果您想延迟初始承诺的结算,那么Q.fcall
不是您需要的方法:您需要Q.Promise
。
以下是您的预期行为的编码方式:
var promise = Q.Promise(function (resolve, reject) {
setTimeout( function () {
console.log('hi');
resolve(7);
}, 1000 );
});
promise.then(function(contents) {
console.log(contents);
});
setTimeout( function(){console.log('bye');}, 1000 );
<script src="https://cdnjs.cloudflare.com/ajax/libs/q.js/1.5.0/q.js"></script>
请注意,Node 有一个原生的 Promise 库,您可以使用它来执行相同的操作。实在没必要加Q,直接把Q.Promise(...)
换成new Promise(...)
:
var promise = new Promise(function (resolve, reject) {
setTimeout( function () {
console.log('hi');
resolve(7);
}, 1000 );
});
promise.then(function(contents) {
console.log(contents);
});
setTimeout( function(){console.log('bye');}, 1000 );
请注意,“7”的输出顺序略有不同。这是因为 Promises 的本机实现使用微任务来安排 then
回调的执行,而 Q
使用主队列上的事件来安排该执行,该事件稍后发生。许多人会考虑原生行为 "more correct".