【发布时间】:2022-01-08 22:27:37
【问题描述】:
假设我有这段代码,并且我在一个包中编写了一个名为handleSmell() 的函数,其他人可以使用:
const streamSomeUrl = (url='https://salmon.net/river') => {
console.info('...connecting...');
const { data, headers } = await axios({
url,
method: 'GET',
responseType: 'stream',
});
return new Promise((resolve, reject) => {
data.on('data', (chunk) => {
if(smellsFunny(chunk)) {
// promise aware function
handleSmell(chunk) // <--- behaves differently inside a promise.
// E.g. prints "Smell inside a promise"
}
});
})
}
有没有办法让函数handleSmell 判断它是否在承诺中?我的意思是,它的行为与这里不同:
readFile('/etc/fish', (err, data) => {
if(smellsFunny(data)) {
// promise aware function
handleSmell(data) // <--- behaves differently inside a promise.
// E.g. prints "Smell *not* inside a promise"
...
}
});
我试图弄清楚是否可以在不接受拒绝/解决回调的情况下处理 handleSmell 函数(然后如果丢失,知道我没有承诺)。
据我所知,我不能使用传递不同数据的事实,chunk 和 data 都是字符串/缓冲区?
这有可能吗?我受到这个question 的激励,主要来自一个答案:
任何时候你在一个 promise 回调中,你都可以使用 throw。但是,如果您在任何其他异步回调中,则必须使用拒绝。
new Promise(function() {
setTimeout(function() {
throw 'or nah';
// return Promise.reject('or nah'); also won't work
}, 1000);
}).catch(function(e) {
console.log(e); // doesn't happen
});
我的偏好是抛出,但我想知道如果我调用拒绝回调(即来自父拒绝)它会起作用:
function handleSmell(suspectData, reject=False) {
const inPromise = //?????
if (inPromise && reject) {
return reject('SMELLY REJECT!')
} else if (inPromise) {
throw new Error('SMELLY THROWN!')
} else { console.error('SMELLY NON-PROMISE!') }
}
// Both these should work
new Promise(function() {
setTimeout(function() {
handleSmell('cheese');
}).catch(function(e) {
console.log(e); // doesn't try to throw
});
new Promise(function(resolve, reject) {
setTimeout(function() {
handleSmell('cheese', reject);
}, 1000);
}).catch(function(e) {
console.log(e); // this works
});
另一种选择是承诺不承诺(根据链接)。
但如果可能的话,我可以避免吗?
【问题讨论】:
-
请注意,您当然不能随便调用一个随机的 Promise.reject,您需要拒绝 您所在的 Promise。
-
我不明白为什么你需要一个新的 Promise 并且不要使用 axios 承诺。这是一个反模式
-
@jonrsharpe 我一定误解了我读到的答案之一的这一部分:
setTimeout(function() { throw 'or nah'; // return Promise.reject('or nah'); also won't work }, 1000); -
您发布的内容说“也行不通”。因为它拒绝了一个 new 承诺,与外部承诺没有任何联系。
-
@GenericUser 这没有在浏览器中使用。我有 nodejs 因为我在 Node 中使用它,它是 ECMAScript 的服务器端表亲。我从一个确实有效的项目中获取了我的代码,但它基于此:futurestud.io/tutorials/…“本教程专门针对 Node.js,因为您会将图像流式传输到光盘上的文件。流式传输选项是'在浏览器中使用库时,Axios 支持。"
标签: javascript node.js promise