【发布时间】:2017-06-25 18:40:27
【问题描述】:
这是我的 Promise 代码的简化示例:
var sharedLocalStream = null;
// ...
function getVideoStream() {
return new Promise(function(resolve, reject) {
if (sharedLocalStream) {
console.log('sharedLocalStream is defined');
resolve(sharedLocalStream);
} else {
console.log('sharedLocalStream is null, requesting it');
navigator
.mediaDevices
.getUserMedia(constraints)
.then(function(stream) {
console.log('got local videostream', stream);
sharedLocalStream = stream;
resolve(sharedLocalStream);
})
.catch(reject);
}
});
}
我在几个地方异步使用这个函数。 这个问题与函数至少被调用两次有关,但在第二次调用中,promise 永远不会被解决/拒绝。 此代码在 Chrome 中完美运行。我也尝试使用 Angular promises service $q,但也没有用。
我做错了什么以及如何使这段代码工作?
另外,我一直在思考如何在这种情况下避免承诺,但我别无选择,因为当用户确认麦克风和摄像头访问请求时,我不得不等待。
更新:
var constraints = {
audio: true,
video: true
};
【问题讨论】:
-
这是一个promise anti-pattern,因为您将现有的承诺包装在另一个承诺中,而不是仅仅返回您已经拥有的承诺。在你的
if(),你可以只做return Promise.resolve(sharedLocalStream),在你的else,你可以只返回你已经拥有的承诺而无需创建新的承诺。 -
在 Firefox 中没有破坏承诺 - 问题出在其他地方
-
我们不清楚您的问题到底是什么,但我怀疑这是 Firefox 中的承诺问题。这更有可能是您的代码如何使用 Promise 或您调用的某些函数在您调用它两次时如何响应的问题。
-
@jfriend00 你能详细说明一下吗?我刚刚阅读了这个stackoverflow.com/questions/23803743/…,但正如您所见,我的代码需要对刚刚获得的流进行一些处理。
-
@jfriend00 - 改为查看developer.mozilla.org/en-US/docs/Web/API/MediaDevices/…
标签: javascript angularjs promise es6-promise