以下是我使用的代碼:
const { exec } = require("child_process") 。
exec("ls -la", (error, stdout, stderr) => /span> {
if (error) {
console.log(`error: ${error.message}`)。)
return;
}
if (stderr) {
console.log(`stderr: ${stderr}`)。)
return;
}
console.log(`stdout: ${stdout}`)。)
});
它回傳 "0",然后在控制臺記錄正確的結果。
但是如何直接回傳結果,而不是console.log?
uj5u.com熱心網友回復:
你不能從那個回呼中回傳一個值,因為它不會被傳遞給任何東西。你可以做的是定義一個Promise,將stdout傳遞給決議方法。下面是一個例子:
const { exec } = require("child_process") 。
function ls() {
return new Promise((resolve, reject) => /span> {
exec("ls -la", (error, stdout, stderr) =>/span> {
if (error) {
console.log(`error: ${error.message}`)。)
reject(error.message)。
}
if (stderr) {
console.log(`stderr: ${stderr}`)。)
reject(stderr)。
}
console.log(`stdout: ${stdout}`)。)
resolve(stdout)。
});
});
}
我在這里做的是定義一個函式,該函式創建一個新的Promise。這個 Promise 將執行你的代碼(ls -la 呼叫),如果出現錯誤,它將觸發一個例外,拒絕這個 Promise;如果一切正常,它將解決這個 Promise,并傳遞 stdout 值。
然后你可以用這樣的方式來使用這個Promise:
ls().then((out) => /span> {
console.log(out)。
})
out變數將包含你的stdout.
。如果你想讓某個函式回傳該值,應該從這個函式中等待它。一個例子可以是這樣的:
async function unwrapLs() {
const stdout = await ls() 。
return stdout。
注意,你只能從一個異步函式中呼叫unwrapLs(),因為你必須等待其值。事實上,這相當于通過等待來呼叫ls(),但你只能從一個異步函式中進行。
uj5u.com熱心網友回復:
你所遇到的問題是,運行一個作業系統命令需要時間(也許是無限長的時間)。 在這之前,Javascript不會直接停止執行,所以它是異步運行的。
一個值必須被回傳。
必須回傳一個值,并且必須在完成之前回傳給呼叫者。使用承諾,回傳的值是一個承諾。
由于你使用的是 Construct 2 引擎,它沒有異步呼叫的機制,所以你將不會直接得到一個結果。
然而,Construct 2引擎有一個機制,可以使用Function物件
你的javascript應該看起來像這樣:
const { exec } = require("child_process") 。
function ls(callback) {
exec("ls -la", (error, stdout, stderr) => /span>{
if (c2_callFunction)
c2_callFunction(callback, [error, stdout, stderr])。
});
}
你會這樣呼叫 :
Browser.ExecJS("ls('lsresult')"/span>)
但是,為了得到結果,你必須定義一個名為 "lsresult "的Function物件,向該函式添加引數(error、stdout、stderr)并在那里處理結果。
檔案在這里。https://www.construct.net/en/construct-2/manuals/construct-2/plugin-reference/function
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/322221.html
標籤:
上一篇:當試圖使用mongoose中的創建來保存多條記錄時,出現了400個錯誤請求
下一篇:級聯引數Task<AthenticationState>如何在BlazorWASM中的AuthorizeView和AuthorizedRouteView中解包并公開為“背景關系”?
