2016-04-05 6 views
0

を約束このスクリプトは完璧に動作し、一つの問題で、「runTenant」方法「)(全て」から解決する必要があること(約束を返していないノード戻りBluebirdJSは、私は小さな問題を抱えている

このコード:

Promise.resolve(runTenant(latest)).then(function() { 
    end(); 
}); 

コールこのコード:

function runTenant(cb) { 
    return new Promise(function() { 
    //global var 
    if (!Tenant) { 
     loadCoreModels(); 
     Tenant = bookshelf.core.bs.model('Tenant'); 
    } 

    new Tenant().fetchAll() 
     .then(function(tenants) { 

     if (tenants.models.length == 0) { 
      return; 
     } else { 
      async.eachSeries(tenants.models, function(tenant, next) { 

      var account = tenant.attributes; 
      Promise.resolve(db_tenant.config(account)).then(function(knex_tenant_config) { 
       if (knex_tenant_config) { 
       db_tenant.invalidateRequireCacheForFile('knex'); 
       var knex_tenant = require('knex')(knex_tenant_config); 
       var knex_pending = cb(knex_tenant); 
       Promise.resolve(knex_pending).then(function() { 
        next(null, null); 
       }); 
       } else { 
       next(null, null); 
       } 
      }); 

      }); 
     }; 
     }); 
    }); 
} 

それが失速して進行していないがrunTenantからのコードが正しく動作していると「終了()」ための約束「runTenant(最新)」ISN」 〜する解決されました。

明らかでないかのように、私は約束に恐ろしいです。まだ彼らの周りに私の頭を得ることに取り組んでいます。

多くのご協力ありがとうございました!

+0

何らかのエラー:

はここにあなたの関数がどのように見えるかですか? – JordanHendrix

答えて

1

あなたはここですべてのPromiseコンストラクタを使用しないでください(そして、基本的にはどこにもない)、たとえあなたがそれを作ってもantipatternになるでしょう。その約束を決して解決したことはありません。Promiseコンストラクタコールバックへのresolve argumentPromise.resolveとはまったく異なる機能です。

Bluebirdのような強力な約束ライブラリがある場合は、asyncライブラリを使用しないでください。

私が約束していたかのように、私は恐ろしいです。

私は約束機能を書くために私のrules of thumbを見てほしいでしょう。コンソールで

function runTenant(cb) { 
    //global var 
    if (!Tenant) { 
    loadCoreModels(); 
    Tenant = bookshelf.core.bs.model('Tenant'); 
    } 
    return new Tenant().fetchAll().then(function(tenants) { 
    // if (tenants.models.length == 0) { 
    // return; 
    // } else 
    // In case there are no models, the loop iterates zero times, which makes no difference 
    return Promise.each(tenants.models, function(tenant) { 
     var account = tenant.attributes; 
     return db_tenant.config(account).then(function(knex_tenant_config) { 
     if (knex_tenant_config) { 
      db_tenant.invalidateRequireCacheForFile('knex'); 
      var knex_tenant = require('knex')(knex_tenant_config); 
      return cb(knex_tenant); // can return a promise 
     } 
     }); 
    }); 
    }); 
} 
+0

完璧に動作した@Bergiありがとうございました。あなたの経験則をよく読んでいきます。正確に何が起こっているのか、もっと明確に理解したいと思います。私は、それが解決メソッドにあったので、runTenantを呼び出す最初のコードは、それに返された約束が解決されることを印象づけていました。私はあなたの提案(これは完璧に機能しました)で気づいた主な事柄は、リターン。上記のベンも、これをお勧めします。あなたがた両方に感謝します! – sol

+0

ああ、ええ、「解決」とのあなたの混乱についての発言を含むのを忘れてしまった。あなたが理解していないすべての部分について自由にコメントしてください。私はそれらを明確にします。 – Bergi

+0

私はあなたが 'Promise.resolve(db_tenant.config(account))'を必要としているかどうかも分かりません。 'config(...)'は何を返しますか? – Bergi

0

すべてのネストされた約束を返す必要があります。私はこのコードを実行することはできませんので、これは修正されていません。しかし、うまくいけば、何が欠けているかを理解するのに役立ちます。

function runTenant(cb) { 
    //global var 
    if (!Tenant) { 
     loadCoreModels(); 
     Tenant = bookshelf.core.bs.model('Tenant'); 
    } 

    return new Tenant().fetchAll() //added return 
     .then(function (tenants) { 

      if (tenants.models.length == 0) { 
       return; 
      } else { 
       var promises = []; //got to collect the promises 
       tenants.models.each(function (tenant, next) { 

        var account = tenant.attributes; 
        var promise = Promise.resolve(db_tenant.config(account)).then(function (knex_tenant_config) { 
         if (knex_tenant_config) { 
          db_tenant.invalidateRequireCacheForFile('knex'); 
          var knex_tenant = require('knex')(knex_tenant_config); 
          var knex_pending = cb(knex_tenant); 
          return knex_pending; //return value that you want the whole chain to resolve to 
         } 
        }); 
        promises.push(promise); //add promise to collection 
       }); 
       return Promise.all(promises); //make promise from all promises 
      } 
     }); 
} 
+0

また、組み込みプロミスを使用しているようです。代わりに[Bluebird](http://bluebirdjs.com/)を使用することを強くお勧めします。これはPromise.each()のような簡単な方法で構築されています。また、ここにいくつかのエラーについて警告しておいた有用な警告システムもあります。 – Ben

0

runTenantのお約束は決して解決されません。

function runTenant() { 
    return new Promise(function(resolve, reject) { 
    // somewhere in your code 
    if (err) { 
     reject(err); 
    } else { 
     resolve(); 
    } 
    }); 
}); 

そして、あなたは約束のチェーンを使用し、 runTenant機能で cbを渡すべきではありません:あなたは約束を解決するために resolvereject関数を呼び出す必要があり

runTenant() 
.then(latest) 
.then(end) 
.catch(function(err) { 
    console.log(err); 
}); 
関連する問題