Articles of 承诺

socket.io – socket.on等待承诺

我有一个button,与服务器进行一些通信,以检查input的值(通过input框)是否已经存在。 代码如下: $("#button").click(function () { var exists = false; var name = $("#name").val(); socket.emit("check", name); socket.on("checkReturn", function (data) { exists = data.result; }); if (exists) { console.log("exists") } else { if (name.length > 0) { socket.emit("create", name); } } }); }); 问题是checkReturn调用是asynchronous的,因此代码继续执行而没有实际等待结果。 我如何确保checkReturn首先完成,然后才能执行其余的代码?

Q承诺Nodejs如何在循环中解决

我有写在nodejs的代码让我混淆使用Q Promises theFunction() .then(function(data) { var deferred = Q.defer() var result = []; for(i=0; i < data.length; i++) { secondFunc(data.item) .then(function(data2) { data.more = data2.item }); result.push(data); } deferred.resolve(result); deferred.promise(); }); 我想第二个函数里面的数据循环可以推入结果 所以我以前的数据是这样的 [ { id: 1, item: 1, hero: 2 }, { id: 1, item: 1, hero: 2 } ] 像这样 [ { id: […]

为什么我不能在节点v0.11.11中使用Promise?

我只是搞乱了v0.11节点的分支,我想知道为什么我不能使用原生ES6 Promise对象,即使打开了–harmony也是如此。 我正常的浏览器: Google Chrome 32.0.1700.77 (Official Build 244503) JavaScript V8 3.22.24.10 支持他们,而node.js v0.11.11告诉我: > process.versions.v8 '3.22.24.19' 那么给了什么?

为什么NodeJS不使用Promise作为readFile API?

在书https://pragprog.com/book/tbajs/async-javascript中 ,我发现这个: Node的早期迭代在其非阻塞API中使用了Promises。 然而,2010年2月,Ryan Dahl做出了转向现在熟悉的callback(err,results …)格式的决定,理由是Promise是属于“用户区”的更高级别的构造。 这看起来很让人困惑,因为作为一个读取文件的API,这个 fs.readFile('/etc/passwd') .onSuccess(function(data){console.log(data)}) .onError(function(err){throw err}) 看起来比这更好: fs.readFile('/etc/passwd', function (err, data) { if (err) throw err; console.log(data); }); 有没有人有关于为什么“承诺是一个更高级别的构造”会停止在NodeJS API中使用的想法?

Node.js / Sequelize.js / Express.js – 如何插入到多对多的关联? (同步/asynchronous?)

我有两个模型(个人,电子邮件),并试图使用Sequelize命令插入创build的“Individual_Email”表。 虽然Sequelize正在创build所需的表,但在尝试从该表添加/获取/设置时会返回以下错误:“Object [object promise]'没有方法'addEmail'”。 我错过了什么? Sequelize文档说如果模型是用户和项目,“这将添加方法getUsers,setUsers,addUsers到项目和getProjects,setProjects和addProject到用户。 这使我相信(看许诺),我很可能误解了如何使用Node的asynchronousfunction。 我已经尝试了插入的同步和asynchronous版本,都返回上面相同的消息。 续集文档: http ://docs.sequelizejs.com/en/latest/docs/associations/ 码: 路线/ index.js var express = require('express'); var router = express.Router(); var models = require('../models'); /* GET home page. */ router.get('/', function(req, res, next) { 'use strict'; var tIndividual, tEmail; tIndividual = models.Individual.create({ name: "Test" }); tEmail = models.Email.create({ address: "test@gmail.com" }); console.log(tEmail); res.render('index', […]

TypeError:promise.then(…).then(…).then(…).then(…).catch不是Node Js中的函数

我得到这个错误,我不知道如何解决它。 在一个节点的js服务器,我使用一些承诺的.then()函数,并在最后我放置了一个.catch()函数,由于某种原因无法识别。 我在很多地方看过教程,这是如何处理错误的。 我没有使用任何外部库。 错误 : TypeError: promise.then(…).then(…).then(…).then(…).catch is not a function 这是我的代码: exports.joinAlbum = function(req, res){ var promise = Album.findOne().where({'shortId': req.body.shortId}).exec(); // Returns a promise promise.then(function(albumDoc){ console.log('Then #1'); ….. } return albumDoc.save(); // Returns a promise }) .then(function(albumDoc){ console.log('Then #2'); ….. return User.findById(req.body.userId).exec(); // Returns a promise }) .then(function(userDoc){ console.log('Then #3'); …….. return userDoc.save(); […]

如果在抛出任何错误的时候如何在promise中做出断言,不会冒出来呢?

与摩卡运行这个结果超时,而不是让摩卡赶上错误,所以它可能会立即失败.. var when = require('when'); var should = require('should'); describe('', function() { it('', function(done) { var d = when.defer(); d.resolve(); d.promise.then(function() { true.should.be.false; false.should.be.true; throw new Error('Promise'); done(); }); }); }); http://runnable.com/me/U7VmuQurokZCvomD 是否有另外一种方式在诺言中作出断言,如果失败,他们会被摩卡抓住,导致立即失败? 根据柴的build议,我研究了它,似乎我必须有一个直接访问的承诺对象,对不对? 问题是,我没有直接使用诺言。如果我简化,我的坏,但这将是一个更接近现实的例子 function core_library_function(callback){ do_something_async(function which_returns_a(promise){ promise.then(function(){ callback(thing); }); }); } describe('', function() { it('', function(done) { core_library_function(function(thing){ … done(); }); }); […]

为什么promise.join()将函数作为最后一个参数?

说我在一个需要检索两个对象的过程中有一个步骤。 我将使用join()来协调检索: return promise.join(retrieveA(), retrieveB()) .spread(function(A, B) { // create something out of A and B }); 该文档显示您也可以传递处理程序作为最后一个参数: return promise.join(retrieveA(), retrieveB(), function(A, B) { // create something out of A and B }); 我很好奇这个选项存在的理由是什么。

如何做promise.all数组promise的数组?

我试图运行数组函数并行,当每个人都完成我想要的结果工作。 我正在使用承诺。 现在,我可以把所有的function在一个数组,并可以做Promise.all(数组的function),但我有像数组 [[promise1, promise2], [promise3,promise4], [promise5,promise6]], 每个承诺都是promisifiedfunction。 Promise参考文档中说Promise.all中的参数应该是一个可迭代的对象,我的数组是可迭代的。 但这不适合我。 我认为它正在执行[promise1,promise2]作为承诺,但不是个人承诺。 任何人都可以帮助我,我怎么能实现它或有没有更好的办法?

Firebase .orderByChild()。equalTo()。once()。then()当孩子不存在时承诺

我的API /auth/login端点需要像这样的req.body : { "email": "jacob@gmail.com", "password": "supersecretpassword" } 在端点上,我参考了我的Firebase数据库( https://jacob.firebaseio.com/users )。 我search数据,当我find一个与req.body.email相匹配的req.body.email ,我将密码与数据库中存储的密码进行比较。 我遵循这个Firebase博客文章中概述的承诺结构。 router.post('/login', function(req, res) { const ref = db.ref('/users'); ref.orderByChild('email') .equalTo(req.body.email) .once('child_added') .then(function (snapshot) { return snapshot.val(); }) .then(function (usr) { // Do my thing, throw any errors that come up }) .catch(function (err) { // Handle my errors with grace […]