【问题标题】:Nodejs Creating a function that takes a function and executes it (creating a wrapper)Nodejs 创建一个接受函数并执行它的函数(创建一个包装器)
【发布时间】:2017-03-25 03:29:31
【问题描述】:

我的 google foo 无法使用这些关键字。

基本上,我试图避免在我正在创建的函数周围一遍又一遍地键入相同的代码结构,所以我想围绕我想要执行的函数创建一个包装器。这很混乱,我似乎无法弄清楚如何用我正在做的事情来“工作”。这是我到目前为止想出的,它不正确,但我把它贴在这里,这样你就可以有基本的想法了。

我正在使用 bluebird 的 Promise 和协程。

包装器:

'use strict';
const Promise = require('bluebird');
const {coroutine: co} = require('bluebird'); //Alias coroutine

module.exports = function(func) {
    return new Promise((resolve, reject)=>{
     co(function* () {
            try {
                //Want to execute the function here
                return func();
            } catch(e) {
                reject(e);
            }
        })()
    });
}

输入功能:

'use strict';
const Promise = require('bluebird');
const wrapper = require('./lib.js');
let arg1 = 'arg1';

wrapper(function(){
    //Print the argument then resolve
    console.log(arg1);
    resolve(arg1);
}).then((data)=>{
    console.log('done');
    console.log(data);
})

我是不是走错了路?我一直在解决或争论时出错。 本质上,我只是不想为我编写的每个函数不断声明 promise、co 和 try/catch。

【问题讨论】:

  • 似乎resolve 未定义?你打算使用Promise.resolve
  • 我的想法是在原始函数中调用解析,认为包装器会知道如何处理它......
  • 是 func 包装器吗?你可以通过决议来资助
  • 用 Promise.resolve() 试过了,then 没有被调用。我假设我需要在包装器中调用解析?但是我需要在我提供给它的函数中调用 resolve,这样我就知道它已经完成了......
  • func 是我在“输入部分的函数”包装器中编写的函数,它是带有 module.exports 的文件的别名

标签: javascript node.js


【解决方案1】:

我认为你在正确的轨道上,但这里有多个问题。

包装器:

'use strict';
const Promise = require('bluebird');
const {coroutine: co} = require('bluebird'); //Alias coroutine

module.exports = function(func) {
    return new Promise((resolve, reject)=>{
     co(function* () {
            try {
                // Assumption: `func` returns a promise
                // run the function and 
                // then resolve/reject the promise
                func().then(result => {
                    resolve(result);
                }).catch(err => {
                    reject(err);
                });
            } catch(e) {
                reject(e);
            }
        })()
    });
}

输入功能:

'use strict';
const Promise = require('bluebird');
const wrapper = require('./lib.js');
let arg1 = 'arg1';

wrapper(function(){
    //Print the argument then resolve
    console.log(arg1);
    // must return a promise here
    return Promise.resolve(arg1);
}).then((data)=>{
    console.log('done');
    console.log(data);
})

【讨论】:

  • 我添加了一个要点,说明我最初认为如何使用您在 OP 的 cmets 部分中要求的答案。
猜你喜欢
  • 2020-01-17
  • 2022-11-20
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 2019-10-27
相关资源
最近更新 更多