ES6:如何从内部返回承诺然后阻止

时间:2016-03-09 20:03:06

标签: ecmascript-6 es6-promise

我使用返回promise的函数哈希密码。我试图将结果与node-sqlite3一起使用,db.run()具有接受SQL命令,参数数组和可选回调的var maybeError = hashPassword("foo") .then(function(hashed) { return new Promise(function(resolve, reject) { db.run( "insert into blah hashed value ?", [hashed], function(err) { if(err) reject(err); else resolve(); } ); }); }) .catch(//something else); 方法。我试过以下的东西:

.then()

这个想法在未包含在hashPassword()函数的maybeError块中时有效。我想将server.js Promise导出到单独的// Simulate a database a la node-sqlite3 var fakeDb = function(sql, params, cb) { setTimeout(cb("Error"), 500); }; // Test that the fakeDB() function works by itself var noPromise = function(sql, params) { fakeDb(sql, params, function(e) { document.write(e); }); }; noPromise("foo", "bar"); // Wrap fakeDB() callback in single promise, that works var singlePromise = function(sql, params) { return new Promise(function(resolve, reject) { fakeDb(sql, params, function(e) { if (e) { reject(e); } else { resolve(); } }); }); }; singlePromise("foo", "bar") .catch(function(e) { document.write(e); }); // Simulate a password hashing function that returns a promise var hashPassword = function() { return new Promise(function(resolve, reject) { resolve(); }); }; // Verify that the fake password hashing function works hashPassword() .then(document.write("foo")); /* Now attempt to return a promise from the fakeDB function, * but this time wrap that inside the then() block of hashPassword. * This doesn't work. */ var nestedPromise = hashPassword() .then(function(sql, params) { return new Promise(function(resolve, reject) { fakeDb(sql, params, function(e) { if (e) { reject(e); } else { resolve(); } }); }); }); nestedPromise("foo", "bar") // <== This was the problem: should not have arguments. .catch(function(e) { document.write(e); }) .then(function(x) { document.write(x); }); 文件,该文件将使用它来生成HTTP状态代码等。

编辑:

评论正确地标识了orignal Plunk中的错误,该错误是调整代码以突出我遇到的问题的工件。

更正了该错误后,我认为仍然存在错误,如updated Plunk所示。

ErrorfooError

这会将ErrorfooErrorError而不是return写入文档。 <{1}}函数中的nestedPromise()似乎无效。

谢谢!

2 个答案:

答案 0 :(得分:1)

  

调用nestedPromise时未显示错误。

这是因为nestedPromise承诺(如oldPromise),而非功能(与noPromisesinglePromise不同) 。你不能称之为。你甚至可以在控制台中看到它:

Uncaught TypeError: nestedPromise is not a function

答案 1 :(得分:0)

问题似乎是我用参数调用nestedPromise。 @Bergi编辑了我的Plunk以删除参数。因此,只要你不像白痴一样搞砸函数调用,就可以按照我尝试的方式返回一个承诺。