我正在努力使用async/await并从Promise返回一个值.
function test () {
return new Promise((resolve, reject) => {
resolve('Hello')
})
}
async function c() {
await test()
}
Run Code Online (Sandbox Code Playgroud)
据我所知,我应该能够通过以下方式获得价值:
console.log(c())
Run Code Online (Sandbox Code Playgroud)
但显然我在这里错过了一点,因为这会回报一个承诺.不应该打印"你好"吗?在类似的说明中,我不清楚回调是否需要在将其包装在async/await之前转换为promise?
我希望在通过某些条件解决后停止承诺链.下面的代码可能有助于理解我在说什么.
function update(id, data) {
return new Promise((resolve, reject) => {
let conn;
pool.get()
.then((db) => {
conn = db;
if(Object.keys(data).length === 0) {
return resolve({ updated: 0 });
}
else {
return generateHash(data.password);
}
})
.then((hash) => {
conn.query("UPDATE ... ", (err, queryResult) => {
if(err) {
throw err;
}
resolve({ updated: queryResult.affectedRows });
});
})
.catch((err) => { ... })
});
}
Run Code Online (Sandbox Code Playgroud)
请注意,pool.get()是promise包装的API,用于从我创建的MySQL模块获取连接池.
我正在尝试做的是更新用户数据.并且为了节省服务器资源,如果没有要更新的数据,我避免更新(Object.keys(data).length === 0).
当我尝试这个代码时,即使没有数据要更新,第二个(更新数据库)总是会发生!
我读过这篇文章,但没有奏效.当我调用"return resolve();"时为什么没有停止承诺链?我该如何正确地阻止它?我真的很喜欢使用Promises,但有时候,这种事情会让我发疯.非常感谢帮助我解决这个问题.谢谢!
PS无论如何,我正在使用节点v6.2.2.
我一直在阅读有关如何不阻止 Node 的事件循环的内容。避免阻塞的一种方法是使用分区。
我试图在我的代码中使用分区循环,但我似乎无法等待我的循环。这是我的代码的简化版本:
const report = {
someValue: 0
};
const runLoop = async () => {
report.someValue += 1;
// all sorts of async operations here that use async-await
if (report.someValue < 1000) {
await setImmediate(runLoop);
}
};
await runLoop();
console.log('Report is', report);
Run Code Online (Sandbox Code Playgroud)
这会返回“Report is { someValue: 1 }”,但我希望 someValue 为 1000。
我猜 setImmediate 不会返回承诺,所以我尝试承诺它:
const setImmediatePromise = util.promisify(setImmediate);
const report = {
someValue: 0
};
const runLoop = async () => {
report.someValue += 1; …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的服务中编写一个非常简单的函数,它将创建一个FileReader,读取我发送它的小图像文件,并将此结果返回给我的控制器.文件到我的服务就好了.它到达我的控制器并只记录一个空白行.我假设我在某种程度上弄乱了这个承诺部分.那里我哪里错了?
服务功能 -
this.fileRead = function(file) {
var deferred = $q.defer();
var reader = new FileReader();
reader.readAsDataURL(file);
deferred.resolve(reader.result);
return deferred.promise;
};
Run Code Online (Sandbox Code Playgroud)
控制器功能 -
$scope.onFileSelect = function($files) {
MyService.fileRead($files[0])
.then(function(result) {
console.log(result);
});
};
Run Code Online (Sandbox Code Playgroud) 除了在bluebird中混合还是返回新的Promise()之外,有没有办法在异步函数()中处理回调函数?
例子很有趣......
问题
async function bindClient () {
client.bind(LDAP_USER, LDAP_PASS, (err) => {
if (err) return log.fatal('LDAP Master Could Not Bind', err);
});
}
Run Code Online (Sandbox Code Playgroud)
解
function bindClient () {
return new Promise((resolve, reject) => {
client.bind(LDAP_USER, LDAP_PASS, (err, bindInstance) => {
if (err) {
log.fatal('LDAP Master Could Not Bind', err);
return reject(err);
}
return resolve(bindInstance);
});
});
}
Run Code Online (Sandbox Code Playgroud)
有更优雅的解决方案吗?
使用Angular 5,我想将CSV文件加载到异步管道中,如何将其转换为Promise?
d3.csv(this.csvFile, function(data) {
console.log(data);
});
Run Code Online (Sandbox Code Playgroud) 我想知道如何避免这段代码的厄运金字塔:
原码
var PlayerService = {
getPlayerTeamId: function(playerId, callback) {
$.ajax({
url: "/player/" + playerId + "/team",
success: function(team) {
callback(team.id)
}
});
},
getPlayers: function(teamId, callback) {
$.ajax({
url: "/team/" + teamId + "/player",
success: callback
});
}
};
var PlayerDetailsController = {
playerId: 8,
showTeammatesClick: function() {
PlayerService.getPlayerTeamId(this.playerId, function(teamId) {
PlayerService.getPlayers(teamId, function(playerList) {
// Render playerList
});
});
}
};
Run Code Online (Sandbox Code Playgroud)
这是我的 async/await 版本,以避免出现金字塔: 我的版本
var PlayerService = {
getPlayerTeamId: async function(playerId, callback) {
return await $.ajax({
url: "/player/" …Run Code Online (Sandbox Code Playgroud) 我想在 Vanilla JS 或 Javascript 中执行以下等效操作,但我不知道如何:
$.when( { testing: 123 } ).done(function( x ) {
alert( x.testing ); // Alerts "123"
});
Run Code Online (Sandbox Code Playgroud)
在 Vanilla JS 或 Javascript 中是否有任何等价物?语法是什么?
我使用有api的javascript库.
libapi.callnetwork(arg1,callback(data){
//handle data
}
Run Code Online (Sandbox Code Playgroud)
然后我创建服务函数来像这样调用api
myFunction():Promise<any>{
libapi.callnetwork(arg1,callback(data){
return new Promise(resolve=>resolve(data));
})
}
Run Code Online (Sandbox Code Playgroud)
myFunction将收到错误,因为它必须返回promise或声明为void.如何创建从此API返回承诺的函数?
当我收到服务器响应时如何获取这个值?
当我运行它时,终端没有输出任何信息。
console.log(a);
function findMaxID() {
var a = needle.get(URL, function(err, res){
if (err) throw err;
return 222;
});
return a;
}Run Code Online (Sandbox Code Playgroud)
javascript ×7
node.js ×5
promise ×5
async-await ×2
angular ×1
angularjs ×1
asynchronous ×1
callback ×1
d3.js ×1
ecmascript-6 ×1
es6-promise ×1
jquery ×1
needle.js ×1
recursion ×1
setimmediate ×1
typescript ×1