有人可以向我解释为什么在下面的代码中(使用r25630 Windows),第241行的iInsertTot值为null,或更多,为什么第234行(“return iInsertTot;”)没有被执行,因此,在第241行,iInsertTot为空。第231/232行的iInsertTot值是一个整数。虽然我可以并且可能应该以不同的方式编码,但我认为我会尝试看看它是否有效,因为我对Futures和Chaining的理解是它会起作用。我之前以类似的方式使用过“返回”并且它有效,但在这些情况下我返回null(例如,下面的第201行)。
/// The problem lines are :
233 fUpdateTotalsTable().then((_) {
234 return iInsertTot;
235 });
在调试器中运行时,似乎第234行“返回iInsertTot;”从未实际执行过。从命令行运行具有相同的结果。
第233行调用的方法(fUpdateTotalsTable)是我刚刚添加的过程,它基本上包含此阶段的同步代码。但是,调试器似乎正确地完成了它。
我已经包含方法“fUpdateTotalsTable()”(第1076行)以防万一引起问题。
刚刚添加了第236到245行,但是如果代码无效,我已经将这些行注释掉并运行时出现同样的问题。
218 /*
219 * Process Inserts
220 */
221 }).then((_) {
222 sCheckpoint = "fProcessMainInserts";
223 ogPrintLine.fPrintForce ("Processing database ......");
224 int iMaxInserts = int.parse(lsInput[I_MAX_INSERTS]);
225 print ("");
226 return fProcessMainInserts(iMaxInserts, oStopwatch);
227 /*
228 * Update the 'totals' table with the value of Inserts
229 */
230 }).then((int iReturnVal) {
231 int iInsertTot = iReturnVal;
232 sCheckpoint = "fUpdateTotalsTable (insert value)";
233 fUpdateTotalsTable().then((_) {
234 return iInsertTot;
235 });
236 /*
237 * Display totals for inserts
238 */
239 }).then((int iInsertTot) {
240 ogTotals.fPrintTotals(
241 "${iInsertTot} rows inserted - Inserts completed",
242 iInsertTot, oStopwatch.elapsedMilliseconds);
243
244 return null;
245 /*
192 /*
193 * Clear main table if selected
194 */
195 }).then((tReturnVal) {
196 if (tReturnVal)
197 ogPrintLine.fPrintForce("Random Keys Cleared");
198 sCheckpoint = "Clear Table ${S_TABLE_NAME}";
199 bool tClearTable = (lsInput[I_CLEAR_YN] == "y");
200 if (!tFirstInstance)
201 return null;
202 return fClearTable(tClearTable, S_TABLE_NAME);
203
204 /*
205 * Update control row to increment count of instances started
206 */
207 }).then((_) {
1073 /*
1074 * Update totals table with values from inserts and updates
1075 */
1076 async.Future<bool> fUpdateTotalsTable() {
1077 async.Completer<bool> oCompleter = new async.Completer<bool>();
1078
1079 String sCcyValue = ogCcy.fCcyIntToString(ogTotals.iTotAmt);
1080
1081 print ("\n********* Total = ${sCcyValue} \n");
1082
1083 oCompleter.complete(true);
1084 return oCompleter.future;
1085 }
答案 0 :(得分:2)
您的功能 L230-235 不会返回任何内容,这就是iInsertTot
null
L239 的原因。要使其正常工作,您必须在 233 行添加return
。
231 int iInsertTot = iReturnVal;
232 sCheckpoint = "fUpdateTotalsTable (insert value)";
233 return fUpdateTotalsTable().then((_) {
234 return iInsertTot;
235 });