我的代码检查目录中是否存在音频文件。如果不是,则从URL下载文件,然后播放。
if (condition) {
try {
if (fs.existsSync(path)) {
playaudio();
}
else {
checkfile().then(function(){
playaudio();
});
}
}
catch (err){
console.log(err);
}
}
function checkfile () {
try {
if (!fs.existsSync(path)) {
var file = fs.createWriteStream("ring.wav");
var request = http.get("http://mp3.com/ring.wav", function(response) {
response.pipe(file);
});
}
} catch(err) {
console.error(err)
}
}
function playaudio() {
player.play('ring.wav', function(err){
if (err) throw err
})
}
当我运行代码时,它会引发错误:
TypeError:checkfile(...)。然后不是函数
我如何在这里退还诺言?
答案 0 :(得分:2)
您需要先定义一个promise
。
let checkfile = new Promise(function(resolve, reject) {
try {
if (!fs.existsSync(path)) {
var file = fs.createWriteStream("ring.wav");
var request = http.get("http://mp3.com/ring.wav",
function(response) {
response.pipe(file);
resolve("downloaded");
});
}
} catch(err) {
console.error(err)
}
});
现在您可以使用
checkfile.then()....
答案 1 :(得分:1)
在这里,我尝试对代码进行一些整理以使其更易于阅读。正如其他人所说,您需要定义一个承诺。具体来说,您需要编写一个返回promise
的函数。如果函数返回promise
,则可以使用.then
。
请记住,您还需要确定promise
在成功案例,错误案例或拒绝案例中解决的问题。
MDN承诺:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
我没有太多背景信息,因此我对resolve
中的reject
和checkFile
会做什么感到有点不清楚,但我将在下面尝试就如何使其工作提出建议。
if (condition) {
try {
if (fs.existsSync(path)) {
playaudio();
} else {
checkfile().then(function(){
playaudio();
});
}
} catch (err) {
console.log(err);
}
}
function checkfile () {
try {
if (!fs.existsSync(path)) {
var file = fs.createWriteStream("ring.wav");
var request = http.get("http://mp3.com/ring.wav", function(response){
response.pipe(file);
});
}
} catch(err) {
console.error(err)
}
}
function playaudio() {
player.play('ring.wav', function(err){
if (err) throw err
})
}
返回promise及其用法的函数的一般示例:
const somePromiseReturningFunction = function(someParameter) {
return new Promise(function(resolve, reject) {
if (someParameter === 'someDesiredString') {
resolve('Success!');
} else {
reject('Error!');
}
});
};
somePromiseReturningFunction('someDesiredString')
.then(function(resolvedValue) {
console.log(resolvedValue) // prints 'Success!'
})
.catch(function(error) {
console.log(error) // prints 'Error!'
});
checkFile重写以返回承诺:
function checkfile () {
return new Promise(function(resolve, reject) {
try {
if (!fs.existsSync(path)) {
var file = fs.createWriteStream("ring.wav");
var request = http.get("http://mp3.com/ring.wav", function(response){
response.pipe(file);
resolve();
});
}
} catch(err) {
reject(err)
}
});
}