【问题标题】:CallbackHandler in Node.jsNode.js 中的回调处理程序
【发布时间】:2017-05-23 17:09:34
【问题描述】:

我在 .js 文件中有以下方法用于异步网络连接

function requestWatsonDiscovery(queryString) {
    console.log('Query =', queryString);
    if (typeof queryString !== 'undefined') {
        var discoveryUrl = `something`
        console.log('Total url =', discoveryUrl);
        var options = {
            host: 'gateway.watsonplatform.net',
            path: discoveryUrl,
            auth: auth
        };

        http.get(options, function(http_res) {
            // initialize the container for our data
            var data = "";

            // this event fires many times, each time collecting another piece of the response
            http_res.on("data", function(chunk) {
                // append this chunk to our growing `data` var
                //console.log(data);
                data += chunk;
            });

            // this event fires *one* time, after all the `data` events/chunks have been gathered
            http_res.on("end", function() {
                // you can use res.send instead of console.log to output via express
                //console.log(data);
                data = JSON.parse(data);
                watsonReturnedText = parseData(data);
                //console.log(watsonReturnedText);
                //returnResult();
            });
        });
    }
}

同时,我正在另一个 .js 文件中更新我的 UI。我希望在上述异步方法完成时收到通知。我知道我可以使用回调/承诺来做到这一点。你能告诉我写承诺或回调的语法吗?

【问题讨论】:

  • 对承诺使用 RSVP。
  • 请您详细说明一下。我是 javascript 编程新手
  • 使用 Promises 作为 Promise,因为节点有原生 Promise
  • 如果你想防止内存泄漏,应该是.once('end')而不是on('end')

标签: javascript node.js callback promise


【解决方案1】:

简单地说,这应该让您对演示中的回调有基本的了解

function requestWatsonDiscovery (queryString, callback){ // <- new param
    http.get(options, function (http_res) {
        var data = "";

        http_res.on("data", function (chunk) {
            data += chunk;
        });
        http_res.on("end", function () {
            var parseData =JSON.parse(data);
            callback(parseData); // <- usage of new param
        }); 
    });
}

requestWatsonDiscovery(null, function(result) {
    // result is your data;
    console.log(result);
});

【讨论】:

【解决方案2】:

这基本上是..

function requestWatsonDiscovery (queryString){
  return new RSVP.promise((resolve, reject) => {

    if (typeof queryString !== 'undefined') {
      var discoveryUrl = `something`

      var options = {
        host: 'gateway.watsonplatform.net',
        path: discoveryUrl,
        auth : auth
      };

      http.get(options, function (http_res) {
        var data = "";

        http_res.on("data", function (chunk) {
          data += chunk;
        });

        http_res.on("end", function () {
          data =JSON.parse(data);
          watsonReturnedText = parseData(data);
          resolve(watsonReturnedText);
        });
      });
    }
    else { reject(); }
  }); //end promise
}

当您调用您的请求WatsonDiscovery 时,请执行此操作...

var watsonPromise = requestWatsonDiscovery(queryString);

watsonPromise.then((data) => { 
 //use your watson data
}).catch(() => {
 //manage the error
});

【讨论】:

  • 当您只需要在节点中原生提供的标准 Promise/A+ 承诺时,为什么要使用承诺库?甚至github.com/stefanpenner/es6-promise(rsvp 归结为 ES6 承诺)也是可取的,因为代码不需要任何 rsvp 所谓的“玩具”
  • 我知道你说 -RSVP 库是不必要的,因为 node 本身支持这个。你能发布一个语法来帮助我做到这一点。
  • 什么是回复? -1
  • 使用本机或库......但使用它;)解决方案是有效的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
  • 2022-01-18
  • 2017-07-14
  • 2016-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多