Articles of 承诺

抽象函数为了让select返回promise或callback

我不知道也许这是一个反模式。 很快,年轻的开发人员就会join我们的开发团队,我想让他们select是否要使用带有callback或Promises模式的模块。 这个function基本上把数据保存到数据库中。 我重复db.insertstream程来抽象函数,但有没有其他的方法来做到这一点? function create(data, callback) { if(callback) { db.insert(data, function(err, doc) { return callback(err, doc); }); } else { return new Promise(function(res, rej) { db.insert(data, function(err, doc) { if(err) { return reject(err); } return resolve(doc); }); }); } }

Promise中的代码执行和使用返回语句

在这里,虽然使用诺言,我应该需要返回resolve和reject方法 代码执行顺利,但如果有多个条件语句,则会reject和resolve自动结束,或者我们必须使用返回语句 const getJobs = (filters, fieldASTs) => new Promise((resolve, reject) => { const AST = fieldASTs.fieldNodes[0].selectionSet.selections[0] .selectionSet.selections[0].selectionSet.selections; const FIELDS = _.map(AST, n => n.name.value); if (_.includes(FIELDS, 'employer')) { Job.find(filters, (err, d) => { if (err) return reject(err); // should i need to return or just use reject if (err === null && d === […]

为什么可以传递一个非函数参数给Promise.then()而不会导致错误?

我有以下几点: new Promise(resolve => setTimeout(resolve, 2000)) .then(() => console.log("after 2 seconds")); new Promise(resolve => setTimeout(resolve, 3000)) .then(console.log("before 3 seconds (instantly)")); 产生以下输出: > node index.js before 3 seconds (instantly) after 2 seconds Promise.then()期望一个onFulfilled函数,但我通过console.log("before 2 seconds (instantly)") ,这不是一个函数。 两部分问题: 为什么console.log("before 2 seconds (instantly)") (或根本)执行? 为什么第二个Promise在我没有传入函数的时候会引发exception呢?

用res.send()来承诺;

我使用phantomjs和phridge来为单个页面应用程序正确共享页面。 这是一些代码示例: if (isbot(req.headers['user-agent'])){ var url= req.protocol+'://'+req.get('host')+ req.originalUrl phridge.spawn() .then(function (phantom) { var page = phantom.createPage(); return page.run(url, function (url, resolve, reject) { var page = this; page.open(url, function (status) { // handle page after load }); }) .then(function (contnt) { res.send(contnt); }) .then(phridge.disposeAll()); .catch(function (err) { console.error(err.stack); }) } else { next(); } 问题是 […]

asynchronous函数永远不会返回

我使用节点版本7.6.0来尝试本地asynchronous并等待function。 我试图找出为什么我的asynchronous调用悬挂从未真正解决。 NLP模块: const rest = require('unirest') const Redis = require('ioredis') const redis = new Redis() const Promise = require('bluebird') const nlp = {} nlp.queryCache = function(text) { return new Promise(function(resolve, reject) { redis.get(text, (err, result) => { if (err) { console.log("Error querying Redis: ", err) reject(new Error("Error querying Redis: ", err)) } else { […]

为什么Promise.then()中的代码没有被调用?

为什么Promise.then()中的代码没有被调用? 我写了一个expressjs和bluebird承诺的服务器。当我试图使用Promise.promisify()Promisify一个函数时,我发现我在Promise.then()写的代码不起作用。我的代码如下 var Promise = require('bluebird'); var test = function(req) { console.log('123'); }; var regist=Promise.promisify(test); app.post('/test', function (req, res) { reg.regist() .then(function () { console.log('456'); }); 我发布了一个'/ test'的请求,只能看到在控制台上打印了123.如何在Promise.then()工作中编码?

与Promise.all并行操作?

我被引导相信Promise.all执行所有你并行传递的函数,并不关心返回的promise的结束顺序。 但是当我写这个testing代码时: function Promise1(){ return new Promise(function(resolve, reject){ for(let i = 0; i < 10; i++){ console.log("Done Err!"); } resolve(true) }) } function Promise2(){ return new Promise(function(resolve, reject){ for(let i = 0; i < 10; i++){ console.log("Done True!"); } resolve(true) }) } Promise.all([ Promise1(), Promise2() ]) .then(function(){ console.log("All Done!") }) 我得到的结果是这样的 Done Err! Done Err! […]

回报的承诺和内容(可以很多)

我是node.js的新手,试图绕过诺言。 我正在尝试从文件中读取内容,返回一个承诺和文件的内容。 我到目前为止能够阅读文件的内容,并在我的控制台上打印,并返回一个承诺。 我也想返回文件的内容。 这是我的代码到目前为止。 function() { return fs.exists(listFile).then(function (exists) { if(exists) { return fs.readFile(listFile).then(function(response) { console.log(response.toString()); }).catch(function(error) { console.error('failed to read from the file', error); }); } }).catch(function(err) { console.error('Error checking existence', err) }); };

NodeJS:未处理的承诺在方法结束时拒绝

目前,我正在使用快速和mongoose的RESTful-API,现在我有一个问题。 首先,我的方法: public create() : Promise<UserDocument> { return new Promise((user) => { User.exists(this.username).then((exists) => { if (exists) { throw Errors.mongoose.user_already_exists; } else { UserModel.create(this.toIUser()).then((result) => { user(result); }).catch(() => { throw Errors.mongoose.user_create }); } }).catch((error) => { throw error; }) }); } 当我执行这个方法时,我得到了一个未处理的诺言拒绝。 即使我在执行这样的方法时处理错误,也会发生这种情况: User.fromIUser(user).create().then(() => { return response.status(200).send({ message: "Created", user }); }).catch((error) => […]

使用KnexJS查询X个表的数量?

我有一个独特的情况,我有一个优雅的方式解决问题。 用户传递一组他们想要输出数据的信号。 这个数组可以是1 – > Any_Number,所以我首先根据传递的信号来获取表名(每个信号都存储在一个单独的表中),并将它们存储在一个对象中。 下一步是遍历该对象(包含我需要查询的表名),执行每个表的查询并将结果存储在一个对象中,该对象将被传递给Promise中的下一个链。 我还没有看到任何好的方法来处理这个例子,但我知道这是一个相当独特的场景。 在尝试添加对信号数组的支持之前,我的代码简单地如下所示: exports.getRawDataForExport = function(data) { return new Promise(function(resolve, reject) { var getTableName = function() { return knex('monitored_parameter') .where('device_id', data.device_id) .andWhere('internal_name', data.param) .first() .then(function(row) { if(row) { var resp = {"table" : 'monitored_parameter_data_' + row.id, "param" : row.display_name}; return resp; } }); } var getData = function(runningResult) { […]