如何在第一个完成后调用另一个async函数?



我刚刚开始学习Javascript承诺是如何工作的。我懂一些概念和代码。但是在下面的代码片段中,我没有看到"then()"或"catch()";所以我不太确定如何修改它,以便当它成功时,我调用另一个async方法。

const gulp = require('gulp');
const build = require('@microsoft/sp-build-web');
const spsync = require('gulp-spsync-creds').sync;
const sppkgDeploy = require('node-sppkg-deploy');
build.task("deploySharepointApps", {
execute: async () => {
const appList = require("./config/apps.json");
if (!pluginList) {
return;
}

for (const { name, sites } of appList.apps) {
const folderLocation = `./apps/${name}`;
for (const site of sites) {

await new Promise((resolve) => {
gulp
.src(folderLocation)
.pipe(
spsync({
username: creds.username,
password: creds.password,
site: coreOptions.siteUrl + site,
libraryPath: coreOptions.appCatalog,
publish: true,
})
)
.on("finish", resolve);
});
}
}
},
});
当这段代码循环并复制/上传应用程序时,我想使用以下代码部署相同的应用程序:
return sppkgDeploy.deploy({
username: uname, 
password: pswd,
absoluteUrl: catURL
filename: filename,
skipFeatureDeployment: false,
verbose: true
});

你能给我指一下正确的方向如何"连锁"吗?这个吗?现在我正在试验是否可以在。on后面加上。then。

编辑1

我试着像这样改变内部for循环:

for (const site of sites) {
// Here await each gulp pipeline to finish before moving on to the next.
await new Promise((resolve) => {
gulp
.src(folderLocation)
.pipe(
spsync({
username: uname,
password: pswd,
site: coreOptions.siteUrl + site,
libraryPath: coreOptions.appCatalog,
publish: true,
})
)
.on("finish", resolve);
});
await sppkgDeploy.deploy({
username: uname,
password: pswd,
absoluteUrl: catURL,
filename: name,
skipFeatureDeployment: false,
verbose: true,
});
}//end for

弹出错误:

dev3:spfx-plugins admin$ gulp upload-sequential
Build target: DEBUG
[16:00:41] Using gulpfile /src/spfx-plugins/gulpfile.js
[16:00:41] Starting gulp
[16:00:41] Starting 'upload-sequential'...
[16:00:41] Uploading test.sppkg
[16:00:42] Upload successful 1679ms
[16:00:43] Published file 403ms
(node:69005) UnhandledPromiseRejectionWarning: Failed to call the API URL: https://<mydomain>.sharepoint.com/sites/<mysite>/AppCatalog/_api/site?$select=Id
(node:69005) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:69005) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
About to exit with code: 0
Process terminated before summary could be written, possible error in async code not continuing!
Trying to exit with exit code 1

所以我添加了一个try/catch,但是我从来没有在catch中结束。下面是当前代码的样子:

build.task("deploySharepointApps", {
execute: async () => {
try 
{
const appList = require("./config/apps.json");
for (const { name, sites } of pluginList.plugins) {
for (const site of sites) {
[original code]
await sppkgDeploy.deploy({
username: uname,
password: pswd,
absoluteUrl: catURL,
filename: name,
skipFeatureDeployment: false,
verbose: true,
});
} // end for
} //end for
} catch (error) {
console.log('inside the error handler');
}

编辑1:我认为流(pipe)部分存在一些错误,因此在该部分添加了错误处理,从您的日志中我看到至少有1个应用程序已成功发布,所以我相信reject部分将允许您检查进一步的错误。UnhandledPromiseRejectionWarning应与reject部分固定。

for (const site of sites) {
// Here await each gulp pipeline to finish before moving on to the next.
await new Promise((resolve, reject) => {
gulp
.src(folderLocation)
.pipe(
spsync({
username: uname,
password: pswd,
site: coreOptions.siteUrl + site,
libraryPath: coreOptions.appCatalog,
publish: true,
})
)
.on('error', 
(error) =>  { 
console.log('spsync error:', error);
reject(error);
}) 
.on("finish", resolve());
});
await sppkgDeploy.deploy({
username: uname,
password: pswd,
absoluteUrl: catURL,
filename: name,
skipFeatureDeployment: false,
verbose: true,
});
}//end for

我会使用await,因为你在一个标记为async的块内,而不是使用then/catch。当你调用await时,你只在await代码解析时执行下一行代码,或者如果它拒绝,它会转到catch块,如下所示:


const gulp = require("gulp");
const build = require("@microsoft/sp-build-web");
const spsync = require("gulp-spsync-creds").sync;
const sppkgDeploy = require("node-sppkg-deploy");
build.task("deploySharepointApps", {
execute: async () => {
const appList = require("./config/apps.json");
if (!pluginList) {
return;
}
try {
for (const { name, sites } of appList.apps) {
const folderLocation = `./apps/${name}`;
for (const site of sites) {
await new Promise((resolve) => {
gulp
.src(folderLocation)
.pipe(
spsync({
username: creds.username,
password: creds.password,
site: coreOptions.siteUrl + site,
libraryPath: coreOptions.appCatalog,
publish: true,
})
) // Notice the resolve() here
.on("finish", resolve());
});
}
}
await sppkgDeploy.deploy({
username: uname,
password: pswd,
absoluteUrl: catURL,
filename: filename,
skipFeatureDeployment: false,
verbose: true,
});
} catch (error) {
console.log(err);
}
},
});

注意,由于您使用的是await new Promise(...),所以sppkgDeploy.deploy(...)将是最后执行的内容。如果await new Promise(...)抛出错误,您将击中catch块,而不运行部署

的代码。

相关内容

最新更新