gpt4 book ai didi

javascript - 如何从 promise 中的事件处理程序返回值?

转载 作者:行者123 更新时间:2023-11-30 11:52:57 24 4
gpt4 key购买 nike

我正在构建一个使用 nodegit 的 nodeJS 应用程序npm 包。因此,基于他们文档中的示例,我有以下章节。它使用一个 promise 链,看起来像一个 JQuery 事件处理程序。这是我的功能:

export function prepareDiffs() {
var patt = new RegExp('[0-9].[0-9]');
var results: Array<Commit> = [];
Git.Repository.open("features/tutorial") // Open the repository directory.
.then(function (repo) { // Open the master branch.
return repo.getMasterCommit();
})
.then(function (firstCommitOnMaster) { // Display information about commits on master.
var history = firstCommitOnMaster.history(); // Create a new history event emitter.

history.on("commit", function (commit) { // Listen for commit events from the history.
var entry = new Commit();

entry.hash = commit.sha();
var step = patt.exec(commit.message());

if (step !== null) {
entry.step = step.toString();
}
results.push(entry);
})
history.start(); // Start emitting events.
console.log("return");
});
}

因此,将 console.log 放入 history.on() 事件处理程序中会显示我希望看到的所有信息。所以我对我的阵列推送相当有信心。那么我怎样才能让 prepareDiffs() 函数返回填充的 results 数组或者至少是一个解析为数组的 promise ?

注意:我使用的是针对 es6 的 Typescript,因此 async/await 是可用的。

最佳答案

让你的第二个 then 回调创建并返回一个 promise ,然后监听 end 事件并在此时用你的数组解决 promise ,请参阅 *** 评论:

export function prepareDiffs() {
var patt = new RegExp('[0-9].[0-9]');
var results: Array<Commit> = [];
// *** Note we're returning the result of the promise chain
return Git.Repository.open("features/tutorial") // Open the repository directory.
.then(function (repo) { // Open the master branch.
return repo.getMasterCommit();
})
.then(function (firstCommitOnMaster) { // Display information about commits on master.
// *** Create and return a promise
return new Promise(function(resolve, reject) {
var history = firstCommitOnMaster.history(); // Create a new history event emitter.

history
.on("commit", function (commit) { // Listen for commit events from the history.
var entry = new Commit();

entry.hash = commit.sha();
var step = patt.exec(commit.message());

if (step !== null) {
entry.step = step.toString();
}
results.push(entry);
})
.on("end", function() { // *** Listen for the end
// *** Resolve the promise
resolve(results);
});
history.start(); // Start emitting events.
console.log("return");
});
});
}

我想强调的是,大多数时候,当您已经在处理基于 promise 的 API 时,您不想创建新的 promise。但在这种情况下,因为您从事件发射器 history() 返回中获得了一系列异步 commit 事件,所以您不能直接使用 promise 链,所以在这里创建 promise 是可以的。

注意何时我们创建它。我们在那里这样做,以便如果 Git.Repository.opengetMasterCommit 返回的 promise 被拒绝,调用者会看到该拒绝。

关于javascript - 如何从 promise 中的事件处理程序返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38942354/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com