相关疑难解决方法(0)

什么是明确的承诺构建反模式,我该如何避免它?

我编写的代码看起来像:

function getStuffDone(param) {           | function getStuffDone(param) {
    var d = Q.defer(); /* or $q.defer */ |     return new Promise(function(resolve, reject) {
    // or = new $.Deferred() etc.        |     // using a promise constructor
    myPromiseFn(param+1)                 |         myPromiseFn(param+1)
    .then(function(val) { /* or .done */ |         .then(function(val) {
        d.resolve(val);                  |             resolve(val);
    }).catch(function(err) { /* .fail */ |         }).catch(function(err) {
        d.reject(err);                   |             reject(err);
    });                                  |         });
    return d.promise; /* or promise() */ |     });
}                                        | }
Run Code Online (Sandbox Code Playgroud)

有人告诉我这个被称为" 延迟反模式 "或" Promise构造函数反模式 ",这个代码有什么不好,为什么这被称为 …

javascript promise q bluebird es6-promise

479
推荐指数
3
解决办法
7万
查看次数

异步/等待不等待 Promise 解决

看来我对 的使用await不像我理解的那样表现。

我认为async函数和await关键字可以用于返回承诺的调用(例如navigator.mediaDevices.getUserMedia),它会暂停函数执行(如生成器函数),直到承诺解决,然后它会继续执行该函数。

即使我正在等待电话,它也会立即返回,并且我的控制台日志发生故障。具体来说,以“reducer”开头的控制台日志出现在以“getter”开头的控制台之前,此时它应该是相反的/与(我认为)堆栈跟踪应该如何运行相反。

谁能告诉我这里发生了什么?

异步辅助函数 getter:

const getLocalStream = async () => {
  try {
    const localStream = await navigator.mediaDevices.getUserMedia({ video: true, audio: true });
    console.log('getter localStream', localStream);
    console.log('about to return')
    return localStream;
  }
  catch (err) {
    console.error(err);
  }
}

export default getLocalStream;
Run Code Online (Sandbox Code Playgroud)

减速机/存储:

import getLocalStream from './getLocalStream';

const reducer = (state = {}, action) => {
  switch (action.type) {
    case 'SEND_CALL': {
      const { id } = action;
      const localStream …
Run Code Online (Sandbox Code Playgroud)

javascript asynchronous reactjs redux

5
推荐指数
1
解决办法
3462
查看次数

异步/等待错误处理

我正在尝试处理我的方法引发的自定义错误async,但该try catch块无法正常工作。

我认为我这样做的方式应该有效,但错误没有被捕获,并且程序通过在终端中显示它来终止。

这是抛出错误的地方:

async setupTap(tap) {
  const model = this.connection.model('Tap', TapSchema);

  await model.findOneAndUpdate({ id: tap.id }, tap, (err, result) => {
    let error = null;
    if (!result) {
      throw new Error('Tap doesn\'t exists', 404);
    }
    return result;
  });
}
Run Code Online (Sandbox Code Playgroud)

然后是错误处理代码:

async setupTapHandler(request, h) {
  const tapData = {
    id: request.params.id,
    clientId: request.payload.clientId,
    beerId: request.payload.beerId,
    kegId: request.payload.kegId,
  };

  try {
    await this.kegeratorApi.setupTap(tapData);
  } catch (e) {
    if (e.code === 404) return h.response().code(404);
  }

  return h.response().code(204);
} …
Run Code Online (Sandbox Code Playgroud)

javascript error-handling node.js promise async-await

5
推荐指数
1
解决办法
3264
查看次数