当前位置: 首页 > 面试题库 >

试图了解混杂如何与BlueBird一起工作

丁曦哲
2023-03-14
问题内容

我正在尝试使用针对Node.js的Bluebird库来兑现承诺。

下面是一个简单的示例,它无法正常运行。

var Promise = require("bluebird");

var myObj = {
  add: function(op1, op2) {
    return op1 + op2;
  }
};

// Sync call to add method -> 7
console.log(myObj.add(3,4));

var myObjAsync = Promise.promisifyAll(myObj);

// Async call to promisified add method -> nothing written to console
myObjAsync.addAsync(2,3).then(function(data) {
  console.log(data);
  return data;
})

我或者缺少诺言或Bluebird的一些(主要)概念。

在此先感谢您的帮助。

编辑: 根据来自jfriend00的反馈进行了修订(并正在工作的版本)。

var Promise = require("bluebird");

var myObj = {
  add: function(op1, op2) {
    return op1 + op2;
  }
  , add2: function(op1, op2, callback) {
    callback(null, op1 + op2);
  }

};

// Sync call to add method -> 7
console.log(myObj.add(3,4));

var myObjAsync = Promise.promisifyAll(myObj);

// Async call to promisified add method -> nothing written to console
myObjAsync.addAsync(2,3).then(function(data) {
  console.log("%j", data);
  return data;
})

// Async call to promisified add2 method -> 5
myObjAsync.add2Async(2,3).then(function(data) {
  console.log("%j", data);
  return data;
})

问题答案:

为了promisifyAll()正常工作,该函数必须是异步的,并且传递给该函数的最后一个参数必须是完成回调,而完成回调必须以其第一个参数作为错误参数,当没有错误且返回值时为false作为第二个参数(如果有值)。

您的功能不满足任何这些条件。

这是Bluebird文档.promisifyAll()的摘录:

假定目标方法符合node.js回调约定,即接受一个回调作为最后一个参数,并以错误作为第一个参数并以第二个参数的成功值调用该回调。如果node方法使用多个成功值调用其回调,则实现值将是它们的数组。

请记住,.promisifyAll()不能将同步操作转换为异步操作。所采取的是采取符合特定调用约定的异步操作,然后通过挂接回调并测试回调的参数以检测成功或失败并传播返回值,将其包装到Promise中。

如果您对Bluebird的操作方式感到好奇,可以在Github上查看其实际代码,尽管要进行精确的跟踪就很难了。

这里是一个简单的promisify函数版本,用于查看其功能(我建议将Bluebird用于所有其他功能,而不是使用它)。

// --------------------------------------------------------------
// promisify(fn, obj)
//
// Pass an async function that takes as its last argument a callback
// that conforms to the node.js callback calling convention function(err, result)
// passing obj is optional.  If present the function passed in will be called
// as obj.method()
//
// Returns: New function that when called will return a promise.
// --------------------------------------------------------------

function promisify(fn, obj) {
    if (typeof fn !== "function") {
        throw new Error("fn argument to promisify() must be function");
    }
    // obj is optional and may be undefined
    // if present, it will be used as context to call fn as in obj.fn()
    return function(/* args */) {
        // make copy of arguments object into a real array in a way that
        // does not prevent interpreter optimizations
        var args = new Array(arguments.length);
        for (var i = 0; i < args.length; i++) {
            args[i] = arguments[i];
        }
        return new Promise(function(resolve, reject) {
            // add our callback function at the end of the args list
            var resultMany;
            args.push(function(err, result) {
                if (err) {
                    reject(err);
                } else {
                    // if 0 or 1 result, then just return it as a simple value
                    if (arguments.length <= 2) {
                        resolve(result);
                    } else {
                        // if more than one result came with the callback function, 
                        // then put it into an array so we can resolve with a single value (the array of results)
                        // skip the first argument which is the err value
                        resultMany = new Array(arguments.length - 1);
                        for (var i = 0; i < arguments.length - 1; i++) {
                            resultMany[i] = arguments[i + 1];
                        }
                        resolve(resultMany);
                    }
                }
            });
            // call original function with our callback as last argument
            fn.apply(obj, args);
        });
    }
}

这是此promisify()功能的工作演示:https :
//jsfiddle.net/jfriend00/m1265vos/



 类似资料:
  • 问题内容: 我很难理解存储库模式。 关于该主题有很多意见,例如在Repository模式中做得正确,但其他信息,例如Repository是新的Singleton或再次,例如在Do n’t use DAO use Repository中, 或者只是以某种方式使用Spring JPA Data + Hibernate + MySQL + MAVEN 存储库似乎与DAO对象相同。 我厌倦了阅读这些东西,

  • 问题内容: 继续我提出的问题,我试图在我的代码库中使用ThreadPoolExecutor。即使反复尝试从Java API文档中理解,我也无法清楚地理解keepAliveTime要在构造函数中传递的参数的功能/目的。希望有人可以通过一些很好的例子向我解释。 Java文档摘录: keepAliveTime-当线程数大于内核数时,这是多余的空闲线程将在终止之前等待新任务的最长时间。 问题答案: 假设您

  • 我想知道是否有人可以帮助我理解如何将转换表合并到Hypermax算法中。任何示例、伪代码、技巧或实现参考都将不胜感激! 一点背景: Hypermax是一种递归游戏树搜索算法,用于n人游戏,通常用于3人游戏。它是最小最大和α-β修剪的扩展 通常,在游戏树中的每个节点,当前玩家(选择者)将查看其可以做出的所有移动,并选择一个最大化其自身效用的移动。不同于最小值/最大值 我理解换位表是如何工作的,但我不

  • 我已经在Angular 2上使用ImmutableJS有一段时间了,因为它在变化检测方面的性能优势。看这里。 然而,我不太清楚,为什么Immutable在默认情况下与Angular 2一起工作。当没有显式数组时,它如何知道如何迭代值并显示它们?它是否每次访问集合的值时都调用?它实现了Angular 2自动调用的某种方法吗? 如果是这样的话,有没有一种方法可以定义您自己的集合来实现这个方法? 例如:

  • 我试图在一个我的组件中使用Tesseract来执行文件上的ocr。 .ts: .html 我遵循了这个,但是这个错误显示了 我应该怎么做才能让这个工作成功?

  • 我只是很难让我的控制器单元测试正常工作,因为在我看来,如果使用OAuth,SpringDoc中的内容是不够的。在我的例子中,是Oauth2和JWT。 我尝试使用,,甚至使用和自定义定义我自己的注释,但在计算安全表达式时,总是在UserSecurityContext中获得匿名用户,无论我在工厂中设置测试上下文的是什么。。。 我提出了我刚刚想到的解决方案,但由于我不确定嘲笑令牌服务是最有效/干净的方法