简体   繁体   English

解决 Node.js promise 的最佳方法是什么?

[英]What is the best way to resolve Node.js promise?

I try to call my native C++ function implemented with NAN(Native Abstraction for Node.js) with a Promise Asynchronous.我尝试调用我的本机 C++ function 用 NAN(Node.js 的本机抽象)和 Promise 异步实现。 Unfortunately the Promise is never resolved.不幸的是,Promise 从未得到解决。 My Code in Javascript.我在 Javascript 中的代码。

function callbackDoAsyncStuffFirst() {
  return new Promise(function (resolve, reject) {
    module.doAsyncStuffFirst(function (error, a, v, b) {
      if (error) {
        return reject(error);
      }
      console.log("Resolve First: ", a, " ", b, " ", v, " ");
      let ret = [a, b, v];
      console.log("Return frist Resolve");
      return resolve(ret);
    });
  });
}

function callbackDoAsyncStuff() {
  return new Promise(function (resolve, reject) {
    module.doAsyncStuffSecond(function (error, a, b) {
      if (error) {
        return reject(error);
      }
      console.log("Returned: ", a, " ", b);
      let ret = [a, b];
      console.log("Call Second Resolve");
      return resolve(ret);
    }, 'valueA', 'valueB');
  });
}

let p = callbackDoAsyncStuffFirst().then((retArray) => { console.log("resolve first-->", retArray) });

let second = callbackDoAsyncStuff().then((retArray) => { console.log("resolve second-->: ", retArray) });

The console output looks like控制台 output 看起来像

C++: Start Execute
C++: HandleOKCallback
JS: Resolve First:  a, b, v
JS: Return frist Resolve

After this nothing happens any more.在此之后没有任何事情发生。

This fake module demonstrates that the problem is in your C++ plugin, not in your JavaScript, which works correctly here.这个假模块表明问题出在您的 C++ 插件中,而不是在您的 JavaScript 中,它在这里正常工作。

It also demonstrates how to call the callback with a "successful" set of arguments, in that the first callback argument you are interpreting as an error, which must be falsey in order for you not to reject your promise.它还演示了如何使用一组“成功”的 arguments 调用回调,因为您将第一个回调参数解释为错误,为了不拒绝您的 promise,它必须是错误的。

 var module = { doAsyncStuffFirst: (cb) => { cb(undefined, 'dummy_a1', 'dummy_v1', 'dummy_b1'); }, doAsyncStuffSecond: (cb) => { cb(undefined, 'dummy_a2', 'dummy_b2'); } } function callbackDoAsyncStuffFirst() { return new Promise(function (resolve, reject) { module.doAsyncStuffFirst(function (error, a, v, b) { if (error) { return reject(error); } console.log("Resolve First: ", a, " ", b, " ", v, " "); let ret = [a, b, v]; console.log("Return frist Resolve"); return resolve(ret); }); }); } function callbackDoAsyncStuff() { return new Promise(function (resolve, reject) { module.doAsyncStuffSecond(function (error, a, b) { if (error) { return reject(error); } console.log("Returned: ", a, " ", b); let ret = [a, b]; console.log("Call Second Resolve"); return resolve(ret); }, 'valueA', 'valueB'); }); } let p = callbackDoAsyncStuffFirst().then((retArray) => { console.log("resolve first-->", retArray) }); let second = callbackDoAsyncStuff().then((retArray) => { console.log("resolve second-->: ", retArray) });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM