首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nodejs承诺不再等待

nodejs承诺不再等待
EN

Stack Overflow用户
提问于 2017-07-01 23:14:51
回答 2查看 361关注 0票数 1

我正在完全重写我的问题,请将其进一步简化。

在下面的代码中,为什么x()等同于undefined,而不是console.log('success');记录到控制台的success

最后一行在控制台中执行完毕;然后触发.then()回调。

如何才能使x()在最后一行开始执行之前返回'success‘值。

甚至yF()的计算结果也是undefined。但是,.then()正在响应th y: success

代码语言:javascript
复制
const promise = require('promise');
const requestify = require('requestify');


function x() {
    requestify.get('https://<redacted>/')
        .then(function (d) {
            console.log('success', d.code);
            return 'success';
        })
        .fail(function (f) {
            console.log('fail', f.code);
            return 'fail';
        });
    ;
}


var yF = function () {
    yP   .then(function (th) { console.log("th", th); return th; })
        .catch(function (fl) { console.log("fl", fl); return fl; });
}


var yP = new Promise(
    function (resolve, reject) {
        if (1 == 1) {
            resolve("y: success");
        } else {
            reject(new Error("y: fail"));
        }
    }
);




console.log("hello", x());
console.log("world", yF());
EN

回答 2

Stack Overflow用户

发布于 2017-07-02 05:33:14

函数x不返回值。此示例可能会有所帮助:

代码语言:javascript
复制
> function foo() { console.log('hi from foo'); }
undefined
> console.log('calling foo', foo());
hi from foo
calling foo undefined

您需要在函数中返回promise。函数x可能会发生如下变化:

代码语言:javascript
复制
function x() {
    return requestify.get('https://<redacted>/')
        .then(function (d) {
            console.log('success', d.code);
            return 'success';
        })
        .fail(function (f) {
            console.log('fail', f.code);
            return 'fail';
        });
}

现在可以用then调用x

代码语言:javascript
复制
x().then(result => assert(result === 'success'));
票数 0
EN

Stack Overflow用户

发布于 2017-07-02 07:05:05

两种方法:

1) x() ~我会调用,向前传递一个变量

2) yP()~消费承诺

代码语言:javascript
复制
const promise = require('promise');
const requestify = require('requestify');

var f = "";


function yP() {
    return new Promise(function (resolve, reject) {
        requestify.get('https://<redacted>')
            .then(function (da) {
                var fpt = "success(yP):" + da.code.toString();
                console.log('success-yP', fpt);
                resolve(fpt);
            })
            .catch(function (ca) {
                var fpc = "fail(yP):" + ca.code.toString();
                console.log('fail-yP', fpc);
                reject(fpc);
            });
    });
}


function x() {
    requestify.get('https://<redacted>/')
        .then(function (da) {
            f = "success(x):" + da.code.toString();
            console.log('success-x', f);
            consumef();
        })
        .catch(function (ca) {
            f = "fail(x):" + ca.code.toString();
            console.log('fail-x', ca);
            consumef();
        });
    ;
}


function consumef() {
    console.log("hello", f);

}



x();
yP()
    .then(function (fyPt) { console.log('yP().then', fyPt); })
    .catch(function (fyPc) { console.log('yP().catch', fyPc); });

调试器侦听:5858

成功-yP成功(YP):200

yP().then成功(YP):200

成功-x成功(X):200

hello success(x):200

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44862450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档