【问题标题】:Returning a value of a function with Promise object [duplicate]使用 Promise 对象返回函数的值
【发布时间】:2017-08-01 05:21:26
【问题描述】:

我正在编写一个 getWebContent 函数,该函数使用 Promise(我也在使用 Request 模块)返回网页内容。

我想使用这个函数的方式是var content = getWebContent(),所以content变量包含了请求网站的数据。我是这样开始的:

var request = require('request')

var getWebContent = function () {
    
    target = 'http://www.google.com';
    var result = null;
    var get = function (url) {
        return new Promise(function (resolve, reject) {
            function reqCallback(err, res, body) {
                if (err) reject(err);
                else resolve(body);
            };
            request(url, reqCallback);
        });
    };

    get(target).then(function (res) {
        result = res;
        console.log(res);
    });
    
    return result;
};

var goog = getWebContent();
console.log(goog)

但是,此代码不起作用,因为该函数在 Promise 对象解析之前返回 result 变量,该变量为 null。您能否告诉我应该如何修复我的代码以使其按预期工作?

【问题讨论】:

  • @JLRishe 我正在学习这个网络应用程序,因为我是新手。我不知道你为什么这么讽刺,但我不相信他们这样做是为了好玩。我是否正确回答了您的问题?
  • @JLRishe 感谢您的参考。

标签: javascript node.js promise


【解决方案1】:

无论如何你都需要使用 Promise。您不能从 Javascript 中的异步操作中生成同步结果。

var request = require('request')

var getWebContent = function () {

    target = 'http://www.google.com';
    var result = null;
    var get = function (url) {
        return new Promise(function (resolve, reject) {
            function reqCallback(err, res, body) {
                if (err) reject(err);
                else resolve(body);
            };
            request(url, reqCallback);
        });
    };

    return get(target);
};

var goog = getWebContent().then(function (res) {
  console.log(goog);  
});

【讨论】:

  • 我明白了。那么,是不是我一开始 Promise 就必须一直使用 Promise 链呢?此外,在您修改后的代码中,有没有办法将内容分配给 goog 变量,即 var goog = ?
  • 你可以使用回调,但它并不酷。还有其他一些方法可以处理异步代码,例如 Async,但是是的……一旦你开始了 Promise,你需要用 Promise 链来完成它;)
  • 这样想:在 javascript 中,一旦你承诺,你就不能破坏它:D
  • @NelsonTeixeira 我明白了...一旦承诺,永远不会破坏它。
  • 要清楚,这不是 Promise 独有的......它与处理异步操作的任何方式相同......回调,异步/等待
猜你喜欢
  • 2019-06-30
  • 2019-02-16
  • 2019-01-09
  • 2016-04-10
  • 2016-05-18
  • 2019-12-23
  • 2022-01-23
  • 2020-04-23
  • 2016-08-31
相关资源
最近更新 更多